huankfy

明月出天山,苍茫云海间

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

       数字签名对于发布的软件具有很重要的作用。签名过的软件,对使用者来说,表明软件未被篡改过、可信任的;对开发者/厂商来说,避免第三方的破坏,保证代码的完整性。在企业应用环境中,没有数字签名的软件,通常是不被信任的,比如通过杀毒软件的过滤进行屏蔽(软件签名被破坏,通常是破解行为,容易被侦测到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

 

如何生成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="&quot;$(SignToolPath)signtool.exe&quot; sign /a /fd sha384 /tr http://timestamp.digicert.com /v &quot;$(TargetDir)$(TargetName)*.dll&quot;&#xD;&#xA;&quot;$(SignToolPath)signtool.exe&quot; sign /a /fd sha384 /tr http://timestamp.digicert.com /v &quot;$(TargetDir)$(TargetName)*.exe&quot;" />
  </Target>
View Code
posted on 2022-03-03 21:16  Yanbo.Hu  阅读(1259)  评论(0编辑  收藏  举报