数字签名随笔

一、数字证书

数字证书就像一张身份证,里面包含如下一些信息:

签名算法,如sha1,sha256;颁发者;有效期;使用者;公钥等等

如下图:

Windows下可通过证书管理器 certmgr.msc 查看本机安装的证书

二、对一个exe或dll进行数字签名

signtool sign /v /fd sha256 /sha1 你的证书指纹 /tr http://timestamp.sectigo.com /td sha256 文件名.exe

或signtool sign /v /fd sha256 /f PFX文件 /p PFX文件密码 /tr http://timestamp.sectigo.com /td sha256 文件名.exe

或其他形式

参看文档signtool sign /?

不分截图如下:

思考下signtool的签名过程

  1. 通过提供的证书指纹找到证书文件或PFX文件(包含私钥、证书等信息)直接拿到证书数据,包扩密钥。若是云证书的话,密钥就没有保存在本地,需要登录一个软件,联网才能关联上密钥。
  2. signtool使用用户指定的一个公开的哈希算法(如SHA-256)对原始数据(如一个dll或exe文件内容)进行计算,生成一个固定长度、独一无二的字符串,即数据摘要或哈希值。
  3. 用证书的私钥加密数据摘要,这个数据摘要是数字签名的一部分。
  4. 生成数字签名,写入dll或exe指定的签名数据块中。那数字签名包含哪些信息呢?
    数字证书(含公钥、证书路径、身份信息等);数据摘要;时间戳信息。其中这个时间戳信息也是经过认证的。
    • 签名时间:由时间戳服务器(如 http://timestamp.sectigo.com)认证的精确时间。
    • 时间戳签名:时间戳服务器用自己的私钥对"文件哈希+时间"进行签名,防止时间被篡改。
    • 时间戳证书:时间戳服务器的公钥证书,用于验证时间戳的可靠性。

三、对方或使用者验证数字签名

  1. 用证书上的公钥对数字签名中的数据摘要解密,得到一个数据摘要A。
  2. 用数字签名中的摘要算法对当前数据(需要排除数字签名内容)生成一个数据摘要B。
  3. 若数据摘要A与B相等,则数据未篡改,否则数据被篡改。

四、验证证书可信度

以上步骤只验证到了数据完整,但还未验证证书的有效性。

  1. 证书是否伪造或自签发

    证书的有效性需要验证颁发者的数字签名,因为证书上详细记录了颁发者的一条路径,知道根证书机构,这条路径叫做证书路径。

    比如Qt5Core.dll数字签名中的证书路径

    包含3个,验证数字有效性的一个思路:从根证书开始(根证书是预制在操作系统中的,一定有,你信任操作系统开发商就可以信任这个根证书,windows下可在此查看,certmgr:证书>受信任的根证书颁发机构>证书),用根证书的公钥验证DigiCert SHA2 Assured ID Code Signing CA的数字签名,验证通过就再验证下一级,直到验证到The Qt Company Oy。验证过程中只要有一级未通过,就失败了。注:数字签名数据结构都一样的,所以验证方法同三

    注:windows下查看本机的证书,命令certmgr.msc,然后

    certmgr:证书>受信任的根证书颁发机构>证书

  2. 证书是否被吊销

    需要联网,否则只能依赖上次的吊销列表缓存

  3. 证书是否过期

    证书的有效期(起始时间和结束时间)被明文写在证书文件里,并且它和证书的公钥、身份信息一样,是被 CA 的数字签名保护的。验证时,Windows 只需读取本地的系统时间,再和证书里的日期对比一下即可,这是一个纯本地的数学运算。