1. 程式人生 > >使用SHA1、SHA2雙證書進行微軟數字簽名

使用SHA1、SHA2雙證書進行微軟數字簽名

微軟是第一個宣佈了SHA-1棄用計劃,在2016年之後Windows和IE將不再信任SHA-1證書。正好我們公司的數字簽名也到期了,索性就重新申請了sha256和sha1的新數字證書,用來給產品簽名。

這時就要把用了多年的自動簽名指令碼改為支援sha256和sha1雙證書的格式。公司原使用signcode.exe和SignTool.exe兩種方式進行簽名,其中signcode配合另外找的signcode-pwd.exe工具和pvk+spc檔案可以不需要密碼即可實現簽名(不在此文中詳訴),SignTool是直接用pfx證書+密碼來進行簽名。於是分別尋找兩種方式:

查閱signcode的文件發現,signcode

的命令列-a是用來指定數字簽名的簽名演算法。試驗了下,只支援sha1和md5,不支援sha256。所以此方法廢棄。

再查閱SignTool文件,支援/fd來指定簽名,試了md5、sha1、sha256均支援,所以直接在原來簽名程式碼上添加個/sa /fd sha256後如下:

SignTool.exe sign /v /as /ac /f D:\test\sign\sign_sha256\xxx.pfx /p xxxx /t http://timestamp.wosign.com/timestamp /fd sha256 "D:\test_double_signed.exe"

一開始出現/as選項不識別的問題,經研究是使用的SignTool版本

為6.0,因為自己機器上裝了win10的sdk,於是使用了最新的C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe。ps:貌似只有win10帶的才支援/as選項,但nnd這貨依賴的ncrypt.dll,bcrypt.dll等dll只在vista及以上系統有,所以還在用xp的同學就不要用了。如果想拷貝到其它系統上使用,同時拷貝同目錄下的:

appxpackaging.dll
appxsip.dll
mssign32.dll
opcservices.dll
signtool.exe
signtool.exe.manifest
wintrust.dll
wintrust.dll.ini
Microsoft.Windows.Build.Appx.AppxPackaging.dll.manifest
Microsoft.Windows.Build.Appx.AppxSip.dll.manifest
Microsoft.Windows.Build.Appx.OpcServices.dll.manifest
Microsoft.Windows.Build.Signing.mssign32.dll.manifest
Microsoft.Windows.Build.Signing.wintrust.dll.manifest

再試驗出現以下錯誤:

SignTool Error:The /t option is incompatible with the /as option.

SignTool Error: Specify the RFC 3161 timestamp server's URL instead with /tr.

嘗試把/t換成/tr,但是出現錯誤:

SignTool Error: The specified timestamp server either could not be reached orreturned an invalid response.

經過一番努力後,將http://timestamp.wosign.com/timestamp替換成http://timestamp.wosign.com/rfc3161解決問題。http://timestamp.wosign.com/rfc3161是較新的時間戳服務格式,相容/t和/tr,而http://timestamp.wosign.com/timestamp只適用於/t。最後將兩個簽名指令放到批處理檔案裡:

set sign_folder=%~dp0%

%sign_folder%\SignTool.exe sign /v /f %sign_folder%example.pfx /p examplepassword/tr http://timestamp.wosign.com/rfc3161 /fd sha1 "%1"

%sign_folder%\SignTool.exe sign /v/as /f %sign_folder%example.pfx /p examplepassword /tr http://timestamp.wosign.com/rfc3161 /fd sha256 "%1"

別的自動腳本里在想要簽名檔案時,只需要呼叫sign.bat "要簽名的檔案的全路徑"即可簽名後的檔案在win10等系統上顯示兩個簽名,在xp上只顯示一個簽名,如圖所示: