將ActiveX元件做數位簽章之經過
最近幾天為了一個ActiveX的元件傷透了腦筋,倒不是做不出來,而是做出來後無法在一台NT 4.0與IE 5.5的機器上運作。於是種種的猜測油然而生…
1. 首先在我的電腦開啟該網頁時,會出現”目前的安全性設定會禁止在目前的畫面執行ActiveX控制項”的錯誤訊息,為了讓測試順利進行,因此先將IE的安全性設定中”下載未簽名的ActiveX控制項”的設定由”關閉”調整為”提示”。果然在我的電腦上就可以正常的開啟網頁。
2. 為了要測試相容性,於是就找了一台NT 4.0與IE 5.5的機器進行測試,不知什麼原因,網頁沒有出現訊息,但是ActiveX控制項就是無法在網頁上顯示,因此懷疑是否IE不同版本對ActiveX控制項是否簽章的接受度不同,因此開始想要做一個有簽章的ActiveX控制項。
3. 雖然在SDK中有提供製作測試的憑證(Certificate),但是我還是覺得要使用微軟的Certificate Service來做會較實在。
4. 安裝過程還算順利,接著就要產生憑證了。一般是透過該機器的網頁 http://localhost/certsrv/ 來進行憑證的要求(Certificate Request)。”要求憑證-進階要求-使用這個表單將憑證要求提交給憑證授權單位-用途-程式碼簽署憑證-金鑰標示成可匯出-將金鑰匯出到檔案(附檔名為.pvk)。”
5. 憑證要求成功後,可於”系統管理工具-憑證授權單位-擱置要求”中將該憑證”發行”。若成功,可於”發出的憑證”中看到該憑證。
6. 透過該機器的網頁 http://localhost/certsrv/ 來進行憑證的下載。”檢查擱置中的憑證-選取一個憑證- 下載CA憑證-儲存檔案(附檔名為.cer)”。另一種取得憑證的方法是於”系統管理工具-憑證授權單位-發出的憑證”選取一憑證,用滑鼠右鍵選擇”開啟”,於”詳細資料”項中選擇”複製到檔案”。
7. 接著使用cert2spc.exe產生軟體出版商憑證(Software Publisher Certificate)。
cert2spc mycert.cer mycert.spc
其中 mycert.cer於步驟6產生。
8. 接著使用signcode.exe將.cab檔進行簽章。
signcode –spc mycert.spc –v mycert.pvk myviewer.cab
其中 mycert.cer於步驟6產生,mycert.pvk於步驟4產生,myviewer.cab為VB使用Package & Deployment Wizard所產生的.cab檔。
9. 接著使用chktrust.exe測試簽章結果是否正確。
chktrust myviewer.cab
其中 mycert.cer於步驟8產生。
10. 經過簽章的.cab檔,果然可以在不更改IE安全性設定的情形下運作。但是在NT 4.0的機器上還是有問題。
11. 後來想說試試看安控系統會不會也有問題,結果沒有問題,所以就檢查兩個.cab檔看看是否有不一樣的地方,果然在.cab中的.inf檔有不一樣的地方。在我的.inf檔中有幾個元件的file-win32-x86是指向Microsoft網站。這幾個元件(msstkprp.dll與VB6 Runtime and OLE Automation)在安控系統的.inf中則不存在。後來發現是在執行Package & Deployment Wizard時,其中在”Included Files”步驟中可以選擇是否要 include這些檔案,另外在下個步驟”File Source”中則可以選擇是”Include in this cab”還是 ”Download from Microsoft Web site”。若是Include in this cab,則會由C:\Program Files\Microsoft Visual Studio\VB98\Wizards\PDWizard\Redist目錄中取得所需的檔案。
12. 後來想可能是因為該機器無法連到外部網站的原因,因此重新做一個.cab並選擇不將msstkprp.dll與VB6 Runtime and OLE Automation包含至 .cab中,然後再對該.cab檔簽章,果然NT 4.0 與 IE 5.5也可以顯示網頁了。
13. 為了能讓不同版本的IE可以使用,因此將元件中原來呼叫 Microsoft Internet Controls的Navigate2方法改成Navigate。
後記:
這裡所使用到的工具,可於Windows SDK(C:\Program Files\Microsoft SDK\Bin),或者是Visual Studio. NET 2003(C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin)),或者是Visual Studio. NET 2005(C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin)中取得,但是在Visual Studio. NET 2005中似乎找不到ChkTrust.exe。
1. 首先在我的電腦開啟該網頁時,會出現”目前的安全性設定會禁止在目前的畫面執行ActiveX控制項”的錯誤訊息,為了讓測試順利進行,因此先將IE的安全性設定中”下載未簽名的ActiveX控制項”的設定由”關閉”調整為”提示”。果然在我的電腦上就可以正常的開啟網頁。
2. 為了要測試相容性,於是就找了一台NT 4.0與IE 5.5的機器進行測試,不知什麼原因,網頁沒有出現訊息,但是ActiveX控制項就是無法在網頁上顯示,因此懷疑是否IE不同版本對ActiveX控制項是否簽章的接受度不同,因此開始想要做一個有簽章的ActiveX控制項。
3. 雖然在SDK中有提供製作測試的憑證(Certificate),但是我還是覺得要使用微軟的Certificate Service來做會較實在。
4. 安裝過程還算順利,接著就要產生憑證了。一般是透過該機器的網頁 http://localhost/certsrv/ 來進行憑證的要求(Certificate Request)。”要求憑證-進階要求-使用這個表單將憑證要求提交給憑證授權單位-用途-程式碼簽署憑證-金鑰標示成可匯出-將金鑰匯出到檔案(附檔名為.pvk)。”
5. 憑證要求成功後,可於”系統管理工具-憑證授權單位-擱置要求”中將該憑證”發行”。若成功,可於”發出的憑證”中看到該憑證。
6. 透過該機器的網頁 http://localhost/certsrv/ 來進行憑證的下載。”檢查擱置中的憑證-選取一個憑證- 下載CA憑證-儲存檔案(附檔名為.cer)”。另一種取得憑證的方法是於”系統管理工具-憑證授權單位-發出的憑證”選取一憑證,用滑鼠右鍵選擇”開啟”,於”詳細資料”項中選擇”複製到檔案”。
7. 接著使用cert2spc.exe產生軟體出版商憑證(Software Publisher Certificate)。
cert2spc mycert.cer mycert.spc
其中 mycert.cer於步驟6產生。
8. 接著使用signcode.exe將.cab檔進行簽章。
signcode –spc mycert.spc –v mycert.pvk myviewer.cab
其中 mycert.cer於步驟6產生,mycert.pvk於步驟4產生,myviewer.cab為VB使用Package & Deployment Wizard所產生的.cab檔。
9. 接著使用chktrust.exe測試簽章結果是否正確。
chktrust myviewer.cab
其中 mycert.cer於步驟8產生。
10. 經過簽章的.cab檔,果然可以在不更改IE安全性設定的情形下運作。但是在NT 4.0的機器上還是有問題。
11. 後來想說試試看安控系統會不會也有問題,結果沒有問題,所以就檢查兩個.cab檔看看是否有不一樣的地方,果然在.cab中的.inf檔有不一樣的地方。在我的.inf檔中有幾個元件的file-win32-x86是指向Microsoft網站。這幾個元件(msstkprp.dll與VB6 Runtime and OLE Automation)在安控系統的.inf中則不存在。後來發現是在執行Package & Deployment Wizard時,其中在”Included Files”步驟中可以選擇是否要 include這些檔案,另外在下個步驟”File Source”中則可以選擇是”Include in this cab”還是 ”Download from Microsoft Web site”。若是Include in this cab,則會由C:\Program Files\Microsoft Visual Studio\VB98\Wizards\PDWizard\Redist目錄中取得所需的檔案。
12. 後來想可能是因為該機器無法連到外部網站的原因,因此重新做一個.cab並選擇不將msstkprp.dll與VB6 Runtime and OLE Automation包含至 .cab中,然後再對該.cab檔簽章,果然NT 4.0 與 IE 5.5也可以顯示網頁了。
13. 為了能讓不同版本的IE可以使用,因此將元件中原來呼叫 Microsoft Internet Controls的Navigate2方法改成Navigate。
後記:
這裡所使用到的工具,可於Windows SDK(C:\Program Files\Microsoft SDK\Bin),或者是Visual Studio. NET 2003(C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin)),或者是Visual Studio. NET 2005(C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin)中取得,但是在Visual Studio. NET 2005中似乎找不到ChkTrust.exe。