數字簽名對於發布的軟件具有很重要的作用。簽名過的軟件,對使用者來說,表明軟件未被篡改過、可信任的;對開發者/廠商來說,避免第三方的破壞,保證代碼的完整性。在企業應用環境中,沒有數字簽名的軟件,通常是不被信任的,比如通過殺毒軟件的過濾進行屏蔽(軟件簽名被破壞,通常是破解行為,容易被偵測到hook行為)。
本文將描述如何在Windows平台下獲取簽名證書及獲取后如何對程序/代碼進行數字簽名。
1. CSR
什么是CSR?CSR是Certificate Signing Request的縮寫,是一段經過編碼過的文本,用於向CA機構申請證書。CSR除了必備信息外,還包含了申請證書的機器信息,必備信息為:
a. Common Name
b. Organization
c. Locality
d. Country
除上述信息外,還包含public key信息。對於private key,屬較為敏感信息,可在生成CSR的時候單獨存儲。CA機構在發放證書時,並不需要private key,其僅保留public key以保證信息交換的無抵賴性。
大部分CSR是以base64編碼的,形如下列格式,以"-----BEGIN CERTIFICATE REQUEST-----"開始,以 "-----END CERTIFICATE REQUEST-----"結束:
-----BEGIN CERTIFICATE REQUEST----- MIIDCzCCAfMCAQAwgZkxCzAJBgNVBAYTAlpIMREwDwYDVQQIDAhTaGFuZ2hhaTEL MAkGA1UEBwwCU0gxHjAcBgNVBAoMFVpGIEZyaWVkcmljaHNoYWZlbiBBRzEPMA0G A1UECwwGRklQUTIxMRkwFwYDVQQDDBBaRiBTSCBNYW5hZ2VtZW50MR4wHAYJKoZI hvcNAQkBFg95YW5iby5odUB6Zi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCWw2uxxxgw2d6WRptSY0Z0tryCBEEdpFWIIKApUq5IZ6eyJ57AVyUn 3c3+aRimkBhByDELBkTpVBA1ae+iKI3pidY3RUHnMh9F/j9UZEIMA68sCoemju3U J0LY2E3AMEriBcxNbHl+X0X5k4b7ewumbN7x6A/iw0JipBAGzQlpuCQnQXwUd07P LYiolrOOvhyDCOqf6e/1qHXYZd6vdDBumTqFxsGi32sPeYsKF5JuWaZbLLIv/+9s Tc1h5tkUahMRHAJMoh+/vL5EsiH7/2KEvZSPbKh4FOPknf3s+ArBrcnxhHdSbp0k TSEUssGWvK2D4mqwvg+ym67k7C+EHY5ZAgMBAAGgLDARBgkqhkiG9w0BCQIxBAwC SVQwFwYJKoZIhvcNAQkHMQoMCEFDQ0J1aWxkMA0GCSqGSIb3DQEBCwUAA4IBAQCP 4ogSKHCmvbV0scJoxryergKdMROYh/+9TuGLYmjuyV7hqkrLgwtmhWpAyFjLZTZ1 0d8UlZcurMku0AAF8KlLzAGSQC69N4fMC3ZX5QDkAzp97CFRJlA8Awj+wjlPQVI4 pH8NiwHm6+TPsuTtSgWHAVOeGeju4+/tF3bR8ksL8ucQprggns3VeT77UqNEoxvL nOxcQ6NJ1JZF55j6qmgMR/pViXZhgxEVNejk8JSDLGlBIO7Kikk87iGclEn0yXQa iaMJggtUmNhyQn7+6fbgBhByl5kiXXikS/fiHQuiw6wXVLQph+qO1u3DQhsu0Ykd FrgymC3g2QpNMXUv9rBh -----END CERTIFICATE REQUEST-----
如何生成CSR及private key?可利用windows自帶的工具,或者第三方的工具OpenSSL等。
在Windows中,可打開certmgr.msc控制台程序,在persnal節點中生成CSR文件

在生成CSR的向導中,務必需要注意按照CA機構是否對生成CSR的模板有要求。如有,比如算法、密文長度、用途等,可直接向CA申請模板,或者選擇Custom Request后,按照要求填寫。

如使用OpenSSL工具,可直接鍵入下面的命令
openssl req -newkey rsa:2048 -keyout PRIVATEKEY.key -out MyCSR.csr
執行后,根據提示輸入信息,目錄中將出現privatekey.key和MyCSR.csr文件。注意務必保管好生成的privatekey.key文件,MyCSR.csr是用於向CA機構提交的文件。
上述命令中RSA的長度為2048,長度越長,信息交換安全性越高,但加密代價越大。對512的長度,已經被證實不安全,不再推薦,1024為常用。太長的4096也不建議,加密長度太長,信息交換代價太大,得不償失。
2.向CA證書頒發機構提交CSR
將生成的CSR提交到CA機構后,CA機構會進行一系列驗證(是否符合其指定要求),通過驗證后,會生成證書。提交CSR后,進行等待,通過后會有相應通知去獲取證書文件。
3.根據CA發回的PEM文件,生成pfx證書
CA發放的證書文件,通常可分為.cer、.der、.p7b、.pem文件,這些文件可進行相互轉換。這些文件僅有公鑰信息,直接雙擊安裝或者導入,因缺失私鑰,將無法用來做數字簽名。比如下面的安裝就是無效的證書安裝:

在OpenSSL中,可使用如下命令生成pfx證書:
openssl pkcs12 -export -inkey privatekey.key -in pem_file_from_CA.pem -out cert.pfx
在prompt窗口中,將要求提供訪問privatekey的pass code,此pass code即為創建CSR的輸入的pass code。
4.安裝pfx證書
對生成的pfx證書,可直接雙擊安裝或者導入安裝。安裝完成,可通過瀏覽器查看證書。

如果查看后,沒有最后一行的"You have a private key....",則表明證書安裝無效,此時是沒法使用該證書進行簽名。
5.簽名程序或者code sigining
對第4步中得到pfx文件,可進行程序簽名或代碼簽名。在visual studio中,將pfx文件指定到project文件的屬性頁中,可在編譯時(post event)自動完成簽名。
亦可通過在命令行中手動簽名(簽名中,時間戳同樣重要,但不是強制):
signtool sign /a /fd sha384 /tr http://timestamp.digicert.com /v your_files
或者在visual studio中,通過project的屬性build標簽頁,Post Event中增加上述命令行。這樣在每次編譯/發布的時候,自動簽名:
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Exec Command=""$(SignToolPath)signtool.exe" sign /a /fd sha384 /tr http://timestamp.digicert.com /v "$(TargetDir)$(TargetName)*.dll"
"$(SignToolPath)signtool.exe" sign /a /fd sha384 /tr http://timestamp.digicert.com /v "$(TargetDir)$(TargetName)*.exe"" /> </Target>
