星期五, 6月 08, 2012

以強式名稱簽署第三方組件

專案要用到第三方開放原始碼的組件,而且希望簽署產出,所以被引用的組件需要符合強式名稱,但是沒有,怎麼辦?若有完整的原始碼當然容易,但也許沒有(或不想大動別人的東西)的時候,還是有方法的。先準備以下內容:
  1. 安裝 Windows SDK
  2. 簽署用的 CodeKey.pfx
  3. 要開刀的 WeakName.dll
處理步驟如下:
  1. 反組譯組件,指令為 ildasm.exe /all /out=WeakName.il WeakName.dll,除了正常輸出之外,還附帶 WeakName.res。
  2. 把金鑰拆出,指令為 sn.exe -p CodeKey.pfx CodeKey.snk。
  3. 重組指令為 ilasm.exe /dll /resource=WeakName.res /key=CodeKey.snk WeakName.il,產出結果就是符合強式名稱的組件。
  4. 確認用的指令為 sn.exe -T WeakName.dll。
需要注意的是,「以強式名稱簽署組件」指的是在 Visual Studio 開發工具裏的 Project -> Properties -> Signing -> Sign the assembly,很容易與「數位簽署檔案」混淆。依據微軟官方說法:
  • 強式名稱工具 (sn.exe) 可以協助您以強式名稱簽署組件,提供了金鑰管理、簽章產生和簽章驗證的選項。
  • 簽署工具 (signtool.exe) 能夠數位簽署檔案、驗證檔案中的簽署或為檔案加上時間戳記。
也順便提一下,已經數位簽署的檔案,在檔案總管按滑鼠右鍵看內容,會多出一個「數位簽章」的頁籤。要達成此效果的指令如下:
  • signtool.exe sign /f CodeKey.pfx /p secret /t http://timestamp.verisign.com/scripts/timstamp.dll /v WeakName.dll