[.NET] 使用 .NET Framework 開發 ActiveX Control (3) - 封裝,簽章與部署

本文將會把最後的程序給完成,當完成這個程序後,你就可以把你的控制項部署出去了。

本文將會把最後的程序給完成,當完成這個程序後,你就可以把你的控制項部署出去了。

 

封裝,簽章與部署

在你精心製作完了一個ActiveX控制項後,一定迫不及待的想要部署出去給大家用(例如自然人憑證的元件),但是ActiveX控制項不像我們一般在開發的.NET Framework應用程式,做個安裝檔就可以丟出去的,而是要走幾個步驟:

1. 建立一個安裝程式,將元件封裝到MSI檔內。

2. 設定安裝資訊檔(INF)。

3. 將元件封裝到CAB檔案內。

4. 使用程式碼簽章,簽署元件。

5. 設定網頁引用的codebase路徑,讓用戶端可以自動下載安裝。

首先,我們先為控制項專案建立一個安裝程式,我的安裝專案命名為MyControlInstaller:

clip_image002

建立完成後,請將控制項專案的主要輸出加入安裝專案中,此時安裝專案會將.NET Framework以及控制項的主要檔案加入封裝內,請檢查主要輸出的Register屬性設定是否為vsdrpCOM,這會讓安裝程式在安裝時將組件登錄到用戶端電腦的COM Registry Database內。

clip_image004

檢查完後,請建置這個安裝檔,以產生setup.exe以及MyControlInstaller.msi檔案。

NOTE

如果你看到這個訊息:

clip_image005

無需理會,直接關閉即可。

建置完成後,我們就得到了setup.exe以及MyControlInstaller.msi檔案,接著我們要編寫一個INF資訊檔案,以讓IE在下載CAB解壓縮後,可以得到必要的安裝指令。INF是一個類似以前INI格式的資料檔(可用記事本編輯),它的長相類似於下列指令:

[version]

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

MyControlInstaller.msi=MyControlInstaller.msi

setup.exe=setup.exe

[MyControlInstaller.msi]

file-win32-x86=thiscab

clsid={C90E96C1-8534-4243-9530-960D9AF982CB}

hook=hook1

[setup.exe]

file-win32-x86=thiscab

[Setup Hooks]

hook1=hook1

[hook1]

run=msiexec.exe /i "%EXTRACT_DIR%\MyControlInstaller.msi" /qn

這個檔案最重要的有幾個地方:

1. [version]區段是給IE來識別,只要IE發現這個區段,就會自動解析這個INF檔案。其中的AdvancedINF=2.0是表示要IE對每個部份依序解析。

2. [Add.Code]區段會提示要將CAB中的哪些檔案加入暫存區,如果封裝中有其他檔案要加入的話,就必須要在這個區段中指明,但我們建議直接將要安裝的檔案全部加入安裝專案即可,讓這個區段只需登記安裝程式所要的檔案即可。

3. [MyControlInstaller.msi]以及[setup.exe]是針對檔案所設定,必須要有一個安裝的執行檔會對應到網頁中的GUID,以上例而言,MyControlInstaller.msi會對應到元件的GUID,IE如果在檔案的設定中發現元件的GUID時,就會讀取這個檔案的其他設定,像是要啟動的安裝程式,或是登錄此檔案(RegisterServer=yes)。

4. [Setup Hook]是指示IE要由什麼指令來啟動安裝程式。本例是[hook1]自訂區段。

5. [hook1]是自訂區段,它會指示IE執行run所設定的指令。

NOTE

你的控制項要視你的控制項需求來編寫這個INF,本例的INF只保證可以安裝此控制項。

有了INF檔案後,接下來我們要將它封裝到CAB檔案,以允許IE自動下載安裝,但很不幸的是,Visual Studio內建的封包專案所產生的CAB檔無法讓IE自動啟動安裝程式,所以我們只能靠以前的Cabinet SDK來做。

NOTE

然而微軟的下載中心已不再提供Cabinet SDK,因此只能由外面的網站來找,像是這裡:

http://www.pixelsplasher.com/_downloads/software/Microsoft-Cabinet-SDK/cabsdk.exe

請將Cabinet SDK下載並解壓縮,會得到SDK的必要資源,其中的cabarc.exe是我們需要的壓縮程式,透過它將setup.exe, MyControlInstaller.msi以及Install.inf(元件的INF檔)封裝成CAB檔,它的指令是:

cabarc n [CAB File Name] [Add File1] [Add File2] [Add File3] …

其執行結果如下圖:

clip_image007

現在,我們已經擁有了一個MyControl.cab檔案,此時,我們就可以將它複製到網站專案中,然後在<object>中加入這個CAB檔案的codebase路徑,如下列指令:

<object id="myControl" classid="clsid:C90E96C1-8534-4243-9530-960D9AF982CB" codebase="MyControl.cab" width="0px" height="0px" />

現在找一台未安裝此元件的電腦來瀏覽此網頁(不可以使用開發電腦,因為這樣無法進行部署測試),理論上應該可以下載控制項,但是你會看到這個提示:

clip_image009

這表示因為Internet Explorer安全性設定所致,基本上我們無法要求用戶端把我們的網站設為受信任網站(內部網站也許可以,但公開網站不可能),要讓Internet Explorer不封鎖的話,只有一個辦法,就是對封裝檔進行數位簽章。雖然我們現階段不可能購買商用的數位簽章(以Verisign的簽章來說,一年要499美元),但我們可以使用makecert.exe來產生一個測試用的自我簽章(Self-signed Certificate):

makecert -sr LocalMachine -n "CN=MyCert" -$ commercial -ss MyCertStore -in MyCert -sv MyCert.pvk -a sha1 MyCert.cer

NOTE

makecert.exe的詳細資訊可參考:http://msdn.microsoft.com/zh-tw/library/bfsktky3(VS.80).aspx

NOTE

您在以-sv參數設定輸出私密金鑰時,會被要求設定密碼:

clip_image010

基本上我們建議你一定要為私密金鑰設密碼,否則一旦私密金鑰被盜取,犯罪者可用它來偽造身份。

當你執行完上述的指令後,你會得到一個公鑰檔(MyCert.cer)以及私鑰檔(MyCert.pvk),私鑰檔是很重要的簽署檔案,開發人員必須要妥善的保護它。

在我們使用簽章工具簽署CAB檔之前,我們還要執行兩個程序,一個是將cer轉換成spc(Software Publisher Certificate),這個可以利用cert2spc.exe來做,它的指令很簡單:

cert2spc [Cert1.cer Cert2.cer Cert3.cer ...] [Output.spc]

本例的指令是:

cert2spc MyCert.cer MyCert.spc

再來是將私密金鑰以及SPC檔合併成PFX(Personal Information Exchange)檔,這個可以用pvk2pfx.exe來做,它的指令則是:

pvk2pfx –pvk [Private Key File] –pi [PVK Password] –spc [SPC file] –pfx [PFX File] –po [PFX Password]

本例的指令是:

pvk2pfx –pvk MyCert.pvk –spc MyCert.spc –pfx MyCert.pfx

當整個程序完成後,我們會得到MyCert.cer,MyCert.pvk,MyCert.spc以及MyCert.pfx檔案,此時我們就可以使用簽章工具signtool來簽署CAB檔案,請使用下列指令:

signtool sign /f MyCert.pfx MyControl.cab

NOTE

如果你對signtool.exe的指令用法不熟,可以用signtool signwizard來啟動數位簽章精靈的對話盒,再依指示做簽署即可。

不過就算你完成了簽署,IE仍然會阻擋你的封裝,因為目前的簽章是不被根憑證授權的,所以你需要在測試用戶端上安裝剛才產生的MyCert.cer到根憑證授權單位。方法是先將MyCert.cer複製到測試用戶端,然後在憑證上按兩下,再按『安裝憑證』,在匯入精靈的第二個步驟中,選擇憑證存放區為『信任的根憑證授權』:

clip_image011

然後完成精靈,你會看到這個提示:

clip_image013

請按『是』接受,此憑證就會安裝到受信任根憑證區。現在請重新瀏覽測試網頁,上方的資訊提示列會改變:

clip_image015

這就表示數位簽章檢查已經通過,此時就能按照一般程序來安裝。然後測試元件是否與在開發電腦般正常運作。

針對Windows Vista以及Windows 7作業系統的電腦

前述的作法可以在Windows XP(瀏覽器為IE6)上正常運作,同時使用者也無須額外的程序,但到了Windows Vista以及Windows 7作業系統,由於ActiveX的安裝行為改變了,再也無法使用msiexec.exe /qn的方式在背景安裝,此時我們就只能修改INF的指令,由setup.exe來啟動安裝程式,下列的INF內容即為可在Windows Vista(IE7)與Windows 7(IE8)上執行ActiveX控制項安裝的INF:

[version]

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

Installer.msi=Installer.msi

setup.exe=setup.exe

[Installer.msi]

file-win32-x86=thiscab

clsid={…}

hook=hook1

[setup.exe]

file-win32-x86=thiscab

[Setup Hooks]

hook1=hook1

[hook1]

run=%EXTRACT_DIR%\setup.exe

 

結語

本系列的文章帶領你完成整個 .NET Framework 開發 ActiveX Control 的程序,有了這個程序,你可以再變化它來開發不同的進階控制項 (ex: 自然人憑證控制項)。