背景:爲了防止私鑰泄露,公司裏只有少數幾個人才能訪問到私鑰。其他同事開發時,也需要編譯,但不又能給他們密鑰,我們就需要使用延遲簽名技術了。
1. 創建密鑰對
sn -k mykeyfile.pfx
無密碼保護,該文件需要安全保管
2. 安裝密鑰對到於強名稱 CSP 中容器
sn -i mykeyfile.pfx mykeycontainer
3. 提取公鑰文件
sn -p mykeyfile.pfx mykeyfile.pub
4. 顯示公鑰標記
(短,2780ccd10d57b246這種),用於-Vr選項
sn -q -t mykeyfile.pub
5. 顯示完整公鑰
用於assembly: InternalsVisibleTo的PublicKey
sn -q -tp mykeyfile.pub
6. 使CLR暫時信任程序集的內容
註冊要跳過驗證的程序集,使CLR暫時信任程序集的內容,不對它進行哈希處理,也不對哈希值進行比較。這使程序集能順利安裝到GAC(如果有必要的話)。現在,可以生成引用了這個程序集的其他程序集,並可隨意測試程序集,否則會報錯(程序簽名無效或被串改)。注意,在每臺開發用的機器上,以下命令行都只需執行一次,不必在每次生成程序集時都重複這一步:
sn -Vr MyAssembly.dll
或所有這個PublicKey的程序集sn-Vr *,2780ccd10d57b246
7. 設置項目爲延遲簽名
命令行方式:csc/keyfile: mykeyfile.pub /delaysign MyAssembly.cs
UI方式:在項目中,選擇簽名文件選擇mykeyfile.pub, 然後鉤上“延遲簽名”
8. 真正發佈
結束一個程序集的開發和測試之後,需要正式對其進行簽名,以便打包和部署它。爲了對程序集進行簽名,要再次使用SN.exe實用程序,但這一次換用-R開關,並指定包含了私鑰的文件的名稱。-R開關指示SN.exe對文件內容進行哈希處理,用私鑰對其進行簽名,並將RSA數字簽名嵌入文件中之前預留的空間。經過這一步之後,就可以部署完全簽好名的程序集。在開發和測試機器上,不要忘記使用SN.exe的-Vu或-Vx命令行開關來重新啓用對這個程序集的驗證。
sn -Vu MyAssembly.dll
sn -Vu *,2780ccd10d57b246
使用 infile 中的密鑰對,爲先前已簽名的程序集或延遲簽名的程序集重新簽名。
SN.exe -R MyAssembly.dll mykeyfile.pfx
使用 container 中的密鑰對,爲先前已簽名的程序集或延遲簽名的程序集重新簽名。
SN.exe -Rc MyAssembly.dll mykeycontainer
重新編譯方式
msbuild/p:KeyPairContainer=mykeycontainer,PublicKeyFile="<完整路徑> \mykeyfile.pub"
如果公鑰/私鑰對在一個CSP容器中,必須爲CSC.exe、AL.exe和SN.exe程序指定不同的開關。編譯時(CSC.exe),要指定/keycontainer開關,而不是/keyfile開關;鏈接時(AL.exe),要指定/keyname開關,而不是/keyfile開關;使用強名稱程序(SN.exe)對一個延遲簽名的程序集進行重新簽名時,要指定-Rc開關,而不是-R開關。
重要提示 打包一個程序集前,只要你希望對它執行其他任何操作,延遲簽名都非常有用。例如,可能想要對自己的程序集運行一個混淆器(obfuscator)程序。程序集在完全簽名後,便不能再對它運行混淆器,否則哈希值就不正確了。所以,要想混淆一個程序集文件,或者進行其他形式的"生成後"(post-build)操作,就應該使用延遲簽名,執行所有必要的"生成後"操作,再用-R或-Rc開關運行SN.exe,最終完成對程序集的簽名。