• 软件数字签名 Code Signing


           数字签名对于发布的软件具有很重要的作用。签名过的软件,对使用者来说,表明软件未被篡改过、可信任的;对开发者/厂商来说,避免第三方的破坏,保证代码的完整性。在企业应用环境中,没有数字签名的软件,通常是不被信任的,比如通过杀毒软件的过滤进行屏蔽(软件签名被破坏,通常是破解行为,容易被侦测到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
  • 相关阅读:
    C++中的ravalue学习笔记
    C++中的抽象类
    C++中的显式类型转换
    C++中的继承和多继承
    C++中的多态
    Yocto学习笔记
    HIDL学习笔记
    hadoop2.5搭建过程
    《Redis设计与实现》学习笔记
    40 数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/huankfy/p/Code_Signing.html
Copyright © 2020-2023  润新知