原文链接:http://www.cnblogs.com/qguohog/archive/2013/01/28/2880276.html
前面四篇文章都是在描述如何用C++开发基于MFC的ActiveX插件以及如果对插件进行打包和在Web页面中调用,但确忽略了一个非常重要的问题:代码签名。《浏览器插件之ActiveX开发(三)》提及了两种注册插件的方法,其中IE自动下载并注册插件的方法就涉及到签名问题,如果cab包是未签名的或签名不被信任的,IE就拒绝注册该插件。
一、数字签名简述
现在的各种软件星罗密布、鱼龙混杂,用户在使用软件程序时一定要十分谨慎,稍不留意,就被病毒或恶意程序侵害。代码数字签名的出现就在一定程度上解决了这个问题。那么经过数字签名的软件有什么好处?软件一旦经过数字签名,至少可以保证以下两点:
1)该软件确实是由数字签名证书中显示的软件开发商开发的;
2)该软件自软件开发商发布以后,没有被第三方做过任何修改。
不过,要完全理解数字签名或PKI(数字签名是PKI的组成部分,Public Key Instructure),还需要理解一下基本常识,例如对称加密、非对称加密、摘要算法、公钥、私钥、数字证书、根证书等等。以下几篇文章均对这些概念做了通俗易懂的解读:
a) 白话数字签名
b) CA认证原理以及实现
c) 了解数字证书
d) 软件代码数字签名基本原理
e) 数字签名
f) 为什么需要PKI
g) 数字签名(代码签名)流程
二、为什么ActiveX需要数字签名?
由于ActiveX插件在运行时与本地桌面应用程序一样,对用户系统的资源有极大的访问权限,如果让任何ActiveX通过Web页面都能自动下载并注册的话,那对用户必将造成非常大的威胁。所以默认设置下,IE将对需自动下载的cab文件进行数字签名认证,只有经过数字签名了且签名认证通过的cab包才自动下载并注册到用户系统中。
一般地,不仅仅需要对cab包进行代码签名,在打cab包之前还会对ocx文件进行代码签名。
三、如何进行代码签名?
1、首先需准备用于代码签名的相关工具SignTool.exe,可以从这里下载。
2、申请可用于ocx文件签名的代码签名数字证书,一般是需付费的。如果是测试用,可以有几种方式:
a) 自己创建一个测试签名证书以及根证书;
b) 可以从www.ca365.com网站申请免费代码签名证书或测试证书(应用时需自动导入根证书到用户系统里);
c) 借用淘宝的支付宝证书(淘宝对每个支付宝用户都可以颁发一个数字证书)。
申请数字证书的过程实际上是:
1) 在申请者的计算机上创建一个密钥对,即一个私钥和一个公钥,私钥保留在申请者计算机内,将公钥传送给CA机构;
2) CA机构在通过必要的线下审核后(测试证书和免费证书相当于没有审核过程的),用CA自己的私钥对申请者的申请信息进行签名(申请者信息包括申请者传过来的公钥、申请者自身基本信息等),并加上时间戳。CA对申请信息进行加密后就生成了一个证书,一般是以.cer文件的形式下发给申请者。
3、用signTool工具对文件进行签名:
Signtool sign /f "xxxx.pfx" /d "卡设备读写机ActiveX" /du http://www.51diancai.com /t http://timestamp.verisign.com/scripts/timstamp.dll "xxxxx.cab"
其中:
xxxx.pfx 是签名证书(实际上包含了代码签名数字证书和私钥,在IE的证书管理容器里“个人”里导出时可以选择包含私钥);
http://timestamp.verisign.com/scripts/timstamp.dll 是时间戳服务。
有关代码签名以及创建测试签名证书的问题以下文章均有详细介绍,不再赘述:
- a) 制作临时证书为ActiveX控件签名
- b) 给控件做数字签名
- c) 微软代码签名证书使用指南
- d) VeriSign代码签名证书技术白皮书_v1.0_090413
- e) VC++开发Activex控件以及签名发布
- f) VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- g) ActiveX的数字签名
- h) A Complete ActiveX Web Control Tutorial – CodeProject
四、根证书自动安装问题
如果数字签名证书是从VeriSign等机构购买的,一般不存在根证书问题,因为微软的IE已经默认将VeriSign设置为受信任的根证书机构了:
但如果是从CA365这类不是很权威的机构申请的证书,由于这些机构的根证书默认并不在IE的“受信任的根证书颁发机构”名单里,所以在使用时需要先在用户电脑上将CA365的根证书手动导入进去。其实,12306.cn网站的根证书就是自己给自己颁发的,所以其网站上就明文提示需要自动安装根证书:
对于绝大部分用户来说,对什么什么叫数字签名什么叫根证书之类的概念是一头雾水的,让他们自己安装根证书感觉有点憋屈。如果能让IE自己自动安装根证书就好了。理论上是可以自动安装的,但由于权限的问题实际用起来不是那么爽,用户体验仍然很差。其原理就是利用微软的CAPICOM组件和xenrlinf组件对本地证书进行操作从而达到检测根证书是否存在以及安装证书的目的的,以下有两个文章对此做了描述:
a) 将Capicom调用代码封装到ActiveX——解决javascript调Capicom读取数字证书信息时,IE弹出安全提示的问题
上海证券报社远程办公系统就使用了自动安装根证书的方法:
另外,在CA365上也提供了自动安装根证书的代码例子(如何在用户的客户机上自动安装根证书?):
http://www.ca365.com/forward.do?pageurl=/ca/yhsc/11.jsp
只不过这个例子在运行时一般会出错,以下语句总是创建对象失败:
Set st = CreateObject("CAPICOM.Store")
究其原因,还是浏览器对ActiveX的安全设置问题,降低IE对ActiveX的安全设置就可以了,但这个要求对于用户来说太麻烦了,还不然让用户自己一步一步将根证书导入系统中,或者自己包装一个安装程序,运行后自动导入根证书。
=======================================================================
野文(Jasson Qian)
------------------------------------------------------
博客园: http://qguohog.cnblogs.com
CSDN: http://blog.csdn.net/sallay