You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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指定的SHA256
  • SignatureAlgorithm必须对应RSA-SHA256(OID 1.2.840.113549.1.1.11)
  • 签名值是对DigestInfo结构的RSA加密结果

内容的提问来源于stack exchange,提问作者Chico Rico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:13:30