代码签名证书的时间戳验证码签名方法
以下实现的时间戳的反签名方法允许在代码签名证书过期或吊销后进行签名验证。 时间戳使验证程序能够可靠地知道签名所贴的时间,从而信任签名(如果签名在当时有效)。 时间戳器应具有可靠且受保护的时间源。
一、PKCS #7 签名文档和反符号
PKCS #7 是加密数据的标准格式,包括签名数据、证书和 证书吊销列表 (CRL) 。 时间戳上下文中特定 PKCS #7 类型的兴趣是签名数据,对应于定义的 SignedData 内容类型的 PKCS #7。
PKCS #7 包由 SignedData 组成,用于标识实际内容及其特定信息以及 SignerInfo 签名块。 SignerInfo 本身可能包含计数器符号,递归方式是另一个 SignerInfo。 原则上,可能会存在一系列此类反签名。 countersignature 是与 SignerInfo 中的签名相关的未经身份验证的属性;也就是说,它可能会在原始签名后贴上。 在大纲窗体中:
1、SignedData (PKCS #7)
PKCS #7 的版本 (通常为版本 1)
DigestAlgorithms (SignerInfo 签名块使用的所有算法的集合,以便优化处理)
ContentInfo (contentType 等于 SignedData,以及内容或对内容) 的引用
可选证书 (收集使用的所有证书)
所有 CRL) 的可选 CRL (集合
SignerInfo 签名块 (实际签名,由一个或多个 SignerInfo 签名块组成)
2、SignerInfo (签名块)
PKCS #7 的版本 (通常为版本 1)
证书 (颁发者和序列号,用于在 SignedData) 中唯一标识签名者的证书
DigestAlgorithm 加上 DigestEncryptionAlgorithm 加上 Digest (哈希) ,以及 EncryptedDigest (实际签名)
OPTIONAL AuthenticatedAttributes (例如,此签名者)
可选 UnauthenticatedAttributes (例如,此签名者)
经过身份验证的属性的一个示例是签名时间 (OID 1.2.840.113549.1.9.5) ,因为它是时间戳服务签名的一部分。 未经身份验证的属性的一个示例是计数器签名 (OID 1.2.840.113549.1.9.6) ,因为它可以在签名后加贴。 在这种情况下,SignerInfo 本身包含 SignerInfo (Countersignature) 。
二、SignTool 和 Authenticode 进程
SignTool 可用于验证码签名和时间戳二进制数据。 该工具安装在 Microsoft Windows 软件开发工具包的 \Bin 文件夹中, (SDK) 安装路径。
使用 SignTool 对二进制数据进行签名和时间戳比较简单。 发布者必须从商业代码签名 CA 获取代码签名证书。 为方便起见,Microsoft 发布并更新公共 CA 列表,包括颁发 Authenticode 证书的 CA 列表。 准备好发布时,将使用带 SignTool 工具的相应命令行参数对对象文件进行签名和时间戳。 任何 SignTool 操作的结果始终为 PKCS #7 格式 的 SignedData。
SignTool 接受输入要签名的原始二进制数据和时间戳,或者将以前签名的二进制数据标记为时间戳。 以前签名的数据可以使用 signtool timestamp 命令来标记时间戳。
三、实现详细信息和线路格式
SignTool 依赖于 Windows Authenticode 实现来创建和时间戳签名。 Authenticode 对二进制文件(例如.cab、.exe、.dll或 .ocx)进行操作。 Authenticode 首先创建签名,生成 PKCS #7 SignedData。 这是必须反签名的 SignedData ,如 PKCS #9 中所述。
反签名过程采用四个步骤:
复制签名 (,即 PKCS #7 SignedData 的 SignerInfo 中的 encryptedDigest) 。
构造其内容为原始签名的时间戳请求。 将其发送到时间戳服务器 抽象语法表示法一 (ASN.1) 编码为 TimeStampRequest。
接收从时间戳服务器返回的第二个 PKCS #7 SignedData 格式的时间戳。
将 SignerInfo 从时间戳直接复制到原始 PKCS #7 SignedData 中,作为 PKCS #9 countersignature (即原始) 的 SignerInfo 中未经身份验证的属性。