文件: 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.

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进行了数字签名。(过程中密码随意,因为正式证书要花钱的)

5. 把Patrol.cer 分发到各个客户端IE, 安装后即可使用OCX,而且只要使用一次即可。

其实这一步可以不用,因为到客户端连接此页面时会弹出对话框,里边有未知发行商的连接,可以实现自动下载证书。

6. 服务器发布时要引入RootPatrol.cer证书即可。

CAB格式没有试过, 不过猜想应该可以。

其中有个问题, 在本机做数字签名后,本机测试OK, 然后把web和ocx放到其他的IIS上,使用RootPatrol.cer导入后也可用。

delphi 发布后,但是如果先把web和ocx放到别的IIS上,然后再做数字签名就不行了, 奇怪? 猜想是机器环境的问题,但是是哪个环境不得而知。

Delphi发布ActiveX控件 制作CAB包 数字签名相关的更多相关文章

  1. Delphi 开发ActiveX控件(非ActiveForm)

    Delphi 开发ActiveX控件(非ActiveForm) Q:为什么不采用ActiveForm工程?通过它可以快速开发带窗体控件,创建过程也非常简单(都不用考虑安全接口问题),很省事! A:如果 ...

  2. Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

    一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...

  3. 发布ActiveX控件

    最近我们正在研究ActiveX技术.我们使用Delphi 5创建了一个具有ActiveForm的ActiveX控件应用程序.这个控件产生一个.OCX文件.现在,我们需要把这个控件部署在服务器端,在用户 ...

  4. Delphi创建ActiveX控件,实现安全接口及无界面代码

    Delphi创建OCX控件非常的方便,但IE调用时弹出的安全认证非常麻烦,有时OCX也不需要界面,IE调用时需要隐藏,非常不方便.在DELPHI中创建OCX实现安全接口和创建事件中修改部分代码 实现安 ...

  5. C#制作ActiveX控件及部署升级(摘自网络)

    使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...

  6. 使用C#开发ActiveX控件(新)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  7. 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  8. 使用C#开发ActiveX控件

    使用C#开发ActiveX控件(新) 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动 ...

  9. 使用C#开发ActiveX控件[new]

    文章出处:http://www.cnblogs.com/yilin/p/csharp-activex.html 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以 ...

随机推荐

  1. Expm 9_2 有向图的强连通分量问题

      [问题描述] 给定一个有向图,设计一个算法,求解并输出该图的各个强连通分量. package org.xiu68.exp.exp9; import java.util.ArrayList; imp ...

  2. JetBrains 授权服务器(License Server URLS)

    分享几个已经部署好的在线验证服务器:http://idea.iteblog.com/key.php http://idea.imsxm.com/ http://103.207.69.64:1017 h ...

  3. ZOJ 2314 Reactor Cooling(无源汇有上下界可行流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题目大意: 给n个点,及m根pipe,每根pipe用来流躺 ...

  4. Django项目部署在Linux下以进程方式启动

    Django项目部署在Linux下以进程方式启动 这是一篇关于如何在linux下,以后台进程的方式运行服务,命令改改基本上就通用了. 开发完Django项目后,需要把项目部署到linux环境下.当然, ...

  5. 步步为营-47-分页显示的SQL语句

    说明:分页显示在实际业务中经常需要用到,其SQL语句分两种 1:分页显示SQL语句 --方法一:跳过多少行,选中多少行 --每页n条,选择第m页--n= m= --)*n 主键 from 表); se ...

  6. 内连接,外链接(左连接、右连接、全连接),交叉连接大总结+附SQL JOINS图解[转]

    1.什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 2.分类: 首先划分一下,连接分为三种:内连接.外连接.交叉连接 内连接(INNER ...

  7. Django ORM中使用update_or_create功能再解

    以前,我解过这个问题,现在百度搜索,发了像也只能找到我这个帖子. https://www.cnblogs.com/aguncn/p/4922654.html 今天,看了看官方文档,关于这个update ...

  8. google gcr.io、k8s.gcr.io 国内镜像

    1.首先添加docker官方的国内镜像 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ...

  9. 关于C#中”扩展方法必须在非泛型静态类中定义“问题的解决

    问题描述: 在某个窗口下的编码中使用了以下扩展方法FindControl,以求根据字符串的值去操作控件(本文中的控件为Label控件)的属性. public static Control FindCo ...

  10. PKUWC2019游记&&WC2019游记

    今天好颓,不想写代码了,写写游记 PKUWC2019游记&&WC2019游记 PKUWC2019游记 提前两天就来了中山纪中,考了两天模拟,第一天比较正常,但是可做题只有T3,第二天非 ...