![Delphi发布ActiveX控件 制做CAB包 数字签名相关[转] - 前端开发 - 前端开发的博客](http://static.javashuo.com/static/loading.gif) |
文件: |
SignTool.rar |
大小: |
84KB |
下载: |
下载 |
|
最近我正在研究ActiveX技术。我使用Delphi 7建立了一个具备ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。如今,我须要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。
可是个人控件必须做数字签名之后,IE才会下载安装。问题是如何给ActiveX控件做数字签名呢?现将具体步骤与你们分享。
首先我须要一套作数字签名的工具。若是你没有,能够到如下地址下载:
http://files.cnblogs.com/babyt/SignTool.rar
控件的名字是CustForm.ocx。首先,咱们须要建立一个.CAB文件用来把全部须要发布的文件压缩在一块儿。咱们须要一块儿发布的文件是CustForm.lic文件。它是Delphi在咱们建立控件工程的时候为咱们生成的。若是不发布这个文件,你的控件即便下载安装成功,IE也没法显示它。为了在一个.CAB文件中发布多个文件,咱们必须先建立一个.INF文件。一个.INF文件能够告诉IE,它须要下载的文件和在哪里能够获得这些文件。
1. 建立.INF文件
建立一个.INF文件很简单,用记事本程序编写就能够了。咱们把咱们的.INF文件取名为GMTestX.inf。由于咱们要在.CAB文件中放入GMTest.ocx和GMTest.lic这两个文件,因此咱们的.INF文件的内容以下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [version] signature="$CHICAGO$" AdvancedINF=2.0 [Add.Code] CustForm.ocx=CustForm.ocx CustForm.lic=CustForm.lic //若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行 [CustForm.ocx] file-win32-x86=thiscab clsid={C504DF79-C5EC-4314-AC3E-1F770DB81A01} FileVersion=1,0,0,0 RegisterServer=yes [CustForm.lic]//若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行 file-win32-x86=thiscab//若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行 FileVersion=1,0,0,0//若是建立Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件,那么建立.inf文件时可去掉此行
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在这个.INF文件的[version]部分有两句代码。signature="$CHICAGO$"表示这个.INF文件和Windows95或其后版本和Windows NT 4.0或其后的版本兼容。AdvancedINF=2.0表示Advpack.dll的版本,IE 4.0或其后版本必须导入这个文件去解析这个.INF文件。在这里要求的版本是2.0。
至于[Add.Code]部分,其中列出了在一个.CAB文件中须要下载的文件,并把这些文件的详细信息映射到其后对应的各个部分。好比[CustForm.ocx]部分中的信息就是下载CustForm.ocx这个文件的相关信息。
在[CustForm.ocx]部分的第一句代码告诉IE,CustForm.ocx文件就包含在这个.CAB文件中。第二行注明了这个控件的CLSID号。第三行是控件的版本号。第四行告诉IE须要使用前面的CLSID号来注册这个控件。[CustForm.lic]部分就很少讲了。
2. 建立.CAB文件
在命令行中输入如下代码把CustForm.ocx、CustForm.inf和CustForm.lic这三个文件添加到一个.CAB文件中,这个文件取名为CustForm.cab:
cabarc.exe -s 6144 N CustForm.cab CustForm.ocx CustForm.inf CustForm.lic
3. 建立证书文件
在命令行输入如下命令:
makecert -sv CustForm.pvk -r -n "CN=SunStar" CustForm.cer
4. 转换证书:
cert2spc CustForm.cer CustForm.spc
5. 建立另一个自签名证书,叫test.cer
在命令行中依次输入如下两条命令:
makecert -sv test.pvk -r -n "CN=SunStar" test.cer
cert2spc test.cer test.spc
6. 从test.cer建立test.ctl文件
makectl test.cer test.ctl
7. 用CustForm.pvk和CustForm.spc这两个文件给test.ctl做数字签名
signcode -v CustForm.pvk -spc CustForm.spc test.ctl
8. 把test.ctl移动到受信系统存储区
certmgr -add -ctl test.ctl -s trust
9. 把CustForm.cer移动到根系统存储区
certmgr -add -c GMTestX.cer -s root 10. 用test.pvk和test.spc给CustForm.cab做数字签名
singcode -v test.pvk -spc test.spc CustForm.cab
11. 检查文件是否经过验证
chktrust CustForm.cab
若是文件经过了数字签名检测,系统会询问是否安装这个文件,这时候必定要选择安装,整个签名过程才能完成。
执行以上步骤的过程当中,有时候须要用户输入密码。用户能够任意选择一个密码,好比12345。
接下来,咱们把一个调用Delphi的Web Deploy命令产生的文件CustForm.htm复制到C:\Inetpub\wwwroot\OurHTML文件夹中,并修改其内容以下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <HTML> <H1> 群组配置 </H1><p> <HR><center><P> <OBJECT id =CustForm classid="clsid:7E302B32-912F-427B-98D0-03AB15716E81" codebase="/OurCAB/CustFormX.cab#version=1,0,0,0" width=100% height=80% align=center hspace=0 vspace=0 <param name=Invaild value=Invaild> <param name=wsroot value=http://192.168.0.56:8080/adms/services/> <!--value={TMPL,OUTPUT,COND}--> > </OBJECT> </HTML>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 再将签名的CustForm.cab文件移动到C:\Inetpub\wwwroot\OurCAB文件夹中。
好了,如今打开IE,在地址栏中输入:http://localhost/OurHTML/CustForm.htm后,IE询问是否下载这个控件,咱们选择是,就能够看到咱们的ActiveX控件的窗体了。大功告成!
总算完成了。步骤挺繁琐,可是好像必须这么作。咱们对这个过程当中涉及的相关技术并不十分了解。察看MSDN文档能够找到不少资料,想所有搞清楚得费点劲。无论怎样,用这些步骤就能够达到目的。若是你发现有什么错误,或者有什么疑问,欢迎留言。若是这篇文章对你有所帮助,目的就达到了。谢谢。
==================================================================================
以上是我转录的文章, 使用一下仍是有写问题,主要是发行商的验证问题。
其实我本身作的时候是这样的。
1. 作ActiveXForm, 添加属性方法等实现本身想要的功能。
2. 准备发布, 由于ActiveXForm没有继承实现IObjectSafety接口,则须要实现此即接口,其实这部分能够从AxCtrls单元的TActiveXControl类中把
private FObjectSafetyFlags: DWORD; public { IObjectSafety } function GetInterfaceSafetyOptions(const IID: TIID; pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult; virtual; stdcall; function SetInterfaceSafetyOptions(const IID: TIID; dwOptionSetMask, dwEnabledOptions: DWORD): HResult; virtual; stdcall; 前端 |
及其实现拷贝过来就OK.web
3. 设置web Deploy Option, 设置 include version 和 Auto increment release number 两项便可。而后把web Deploy出去, 得到ocx和htm文件。服务器
4. 使用signtools 对产生的OCX进行数据签名. 例如工具
makecert -sv RootPatrol.pvk -r -n "CN=AAX" RootPatrol.cer cert2spc RootPatrol.cer RootPatrol.spc makecert -sv Patrol.pvk -r -n "CN=AAX" Patrol.cer cert2spc Patrol.cer Patrol.spc makectl Patrol.cer Patrol.ctl signcode -v RootPatrol.pvk -spc RootPatrol.spc Patrol.ctl certmgr -add -ctl Patrol.ctl -s trust certmgr -add -c RootPatrol.cer -s root signcode -v Patrol.pvk -spc Patrol.spc AAProj.ocx chktrust AAProj.ocx 测试 |
这样就对ocx进行了数字签名。(过程当中密码随意,由于正式证书要花钱的)this
5. 把Patrol.cer 分发到各个客户端IE, 安装后便可使用OCX,并且只要使用一次便可。spa
其实这一步能够不用,由于到客户端链接此页面时会弹出对话框,里边有未知发行商的链接,能够实现自动下载证书。.net
![Delphi发布ActiveX控件 制做CAB包 数字签名相关[转] - 前端开发 - 前端开发的博客](http://static.javashuo.com/static/loading.gif)
6. 服务器发布时要引入RootPatrol.cer证书便可。命令行
CAB格式没有试过, 不过猜测应该能够。unix
其中有个问题, 在本机作数字签名后,本机测试OK, 而后把web和ocx放到其余的IIS上,使用RootPatrol.cer导入后也可用。
delphi 发布后,可是若是先把web和ocx放到别的IIS上,而后再作数字签名就不行了, 奇怪? 猜测是机器环境的问题,可是是哪一个环境不得而知。