2011年3月16日星期三

activex的数字签名

最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。
 
    但是我的控件必须作数字签名以后,IE才会下载安装。问题是如何给ActiveX控件作数字签名呢?现将具体步骤与大家分享。
 
    首先我需要一套做数字签名的工具。如果你没有,可以到以下地址下载:
 
    http://www.cnblogs.com/Files/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>
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

没有评论: