|
文件: |
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.web
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進行了數字簽名。(過程當中密碼隨意,由於正式證書要花錢的)this
5. 把Patrol.cer 分發到各個客戶端IE, 安裝後便可使用OCX,並且只要使用一次便可。spa
其實這一步能夠不用,由於到客戶端鏈接此頁面時會彈出對話框,裏邊有未知發行商的鏈接,能夠實現自動下載證書。.net
6. 服務器發佈時要引入RootPatrol.cer證書便可。命令行
CAB格式沒有試過, 不過猜測應該能夠。unix
其中有個問題, 在本機作數字簽名後,本機測試OK, 而後把web和ocx放到其餘的IIS上,使用RootPatrol.cer導入後也可用。
delphi 發佈後,可是若是先把web和ocx放到別的IIS上,而後再作數字簽名就不行了, 奇怪? 猜測是機器環境的問題,可是是哪一個環境不得而知。