Delphi 發佈ActiveX控件 數字簽名(轉)

原作者:光明兄弟

 

最近我正在研究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$"
dvancedINF=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文檔可以找到很多資料,想全部搞清楚得費點勁。不管怎樣,用這些步驟就可以達到目的。如果你發現有什麼錯誤,或者有什麼疑問,歡迎留言。如果這篇文章對你有所幫助,目的就達到了。謝謝。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章