使用signtool /di选项注入外部签名哈希失败,寻求技术帮助
解决Authenticode签名/di注入无效的问题
你的核心问题是外部生成的签名不符合Authenticode要求的PKCS#7 SignedData格式,signtool的/di选项注入的不是裸RSA签名值,而是需要包含签名算法、证书信息的完整PKCS#7结构。以下是具体修正步骤:
1. 明确/di所需的签名格式
Authenticode签名本质是遵循RFC 2315的PKCS#7 SignedData消息,而非单纯的RSA签名结果。这个结构必须包含:
- 待签名哈希的
DigestInfo结构(匹配你指定的SHA256算法) - RSA签名值(对
DigestInfo的签名) - 签名算法OID(SHA256withRSA对应
1.2.840.113549.1.1.11) - 你的公钥证书
你之前直接对哈希做RSA签名得到的是裸签名,signtool无法识别,因此注入后不会生成有效签名。
2. 修正签名生成流程
保持第一步不变:
signtool sign /dg "C:\scratch\dir" /fd SHA256 /f public-cert.cer notepad.exe
这一步生成的notepad.exe.sha256是二进制格式的待签名哈希,无需做Base64解码/编码操作。后续按以下步骤调整:
- 读取
notepad.exe.sha256的二进制内容,用外部RSA工具对其生成签名(注意:部分工具会自动添加DigestInfo头部,若你的工具不支持,需手动构造头部:30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20+ 32字节SHA256哈希) - 将裸签名、公钥证书打包成DER编码的PKCS#7 SignedData结构,推荐用OpenSSL简化操作:
# 假设私钥为PEM格式,签名值保存为signature.bin openssl cms -sign -in notepad.exe.sha256 -out notepad.exe.signed -outform DER -signer public-cert.cer -inkey private-key.pem -md sha256 -nocerts -noattr - 将生成的
notepad.exe.signed放入C:\scratch\dir目录,执行注入命令:signtool sign /di "C:\scratch\dir" notepad.exe
3. 验证签名有效性
- 用OpenSSL检查PKCS#7结构是否正确:
确认输出中包含正确的签名算法、证书信息和签名值。openssl pkcs7 -in notepad.exe.signed -inform DER -text -noout - 用signtool验证最终文件:
查看详细输出中的错误提示,进一步定位问题。signtool verify /v /pa notepad.exe
4. 微软规范参考
Authenticode签名的核心要求基于PKCS#7(RFC 2315),微软对其扩展了特定属性(如时间戳、签名意图)。关键结构要求:
- 签名必须是PKCS#7
SignedData类型 DigestAlgorithm必须匹配/fd指定的SHA256SignatureAlgorithm必须对应RSA-SHA256(OID1.2.840.113549.1.1.11)- 签名值是对
DigestInfo结构的RSA加密结果
内容的提问来源于stack exchange,提问作者Chico Rico
相关产品推荐
相关产品推荐

