前面四篇文章都是在描述如何用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的安全設置就可以了,但這個要求對於用戶來說太麻煩了,還不然讓用戶自己一步一步將根證書導入系統中,或者自己包裝一個安裝程序,運行后自動導入根證書。