zoukankan      html  css  js  c++  java
  • [转] Delphi 发布ActiveX控件 数字签名

     
    原作者:光明兄弟 
     

        最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在,我需要把这个控件部署在服务器端,在用户浏览网页并选择安装这个控件的时候,用户的IE才会下载、安装并显示这个控件。
     
        但是我的控件必须作数字签名以后,IE才会下载安装。问题是如何给ActiveX控件作数字签名呢?现将具体步骤与大家分享。
     
        首先我需要一套做数字签名的工具。如果你没有,可以到以下地址下载:
     
        https://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文档可以找到很多资料,想全部搞清楚得费点劲。不管怎样,用这些步骤就可以达到目的。如果你发现有什么错误,或者有什么疑问,欢迎留言。如果这篇文章对你有所帮助,目的就达到了。谢谢。

  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/twttafku/p/1553389.html
Copyright © 2011-2022 走看看