如何使用Microsoft signtool实现双证书交叉签名(同公钥、指纹与主题)
核心逻辑前置
要拿到不同权威CA签发,但公钥、指纹、主题完全一致的证书,唯一可行的方式是:用**同一个CSR(证书签名请求)**分别向两个CA提交申请。因为CSR里包含了公钥、主题等核心信息,两个CA基于同一个CSR签发的证书,自然会满足你要的公钥、主题一致,指纹(SHA哈希)也会完全相同——毕竟证书的核心主体内容是一样的。
准备步骤
生成统一的CSR和公私钥对
用OpenSSL生成(也可以用Windows自带的certutil,OpenSSL更通用):openssl req -new -newkey rsa:2048 -nodes -keyout my_private.key -out my_csr.csr填写主题信息(CN、O、OU这些字段)时要仔细,确保所有内容固定,后续用这个CSR分别找两个目标CA申请证书,拿到的两张证书命名为
cert_ca1.cer和cert_ca2.cer。打包证书与私钥为PFX
因为SignTool签名需要私钥,把生成的私钥和其中一张证书(比如CA1的)打包成PFX文件:openssl pkcs12 -export -out my_combined.pfx -inkey my_private.key -in cert_ca1.cer输入你设置的PFX密码,后续签名会用到。
确保SignTool可用
SignTool一般随Windows SDK或Visual Studio安装,找到对应的路径(比如C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe),可以把路径加到环境变量里方便调用。
执行双证书签名
直接用SignTool的**/ac**参数添加第二张CA的证书,实现单签名包含双证书的效果:
signtool sign /f my_combined.pfx /p your_pfx_password /ac cert_ca2.cer /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 your_target_file.exe
参数解释:
/f:指定包含主证书(CA1)和私钥的PFX文件/p:PFX的密码/ac:附加第二张CA的证书,这一步是核心,让签名区块包含两张证书/fd:指定签名用的哈希算法(推荐SHA256,SHA1已淘汰)/tr+/td:添加时间戳,防止证书过期后签名失效
验证签名结果
用SignTool验证,确认两张证书都在签名链里:
signtool verify /pa /v your_target_file.exe
查看输出的签名信息,会显示多个证书条目,确认两个CA的证书都被包含在内。
注意事项
- 提前和目标CA确认是否接受自定义CSR:部分CA可能要求用他们提供的工具生成CSR,这时候要沟通清楚,确保能拿到基于同一公钥的双证书。
- 两张证书必须都在有效期内,且信任链完整,否则签名可能不被系统认可。
- 私钥一定要妥善保管,签名必须用生成CSR时的那对私钥,否则签名会失败。
内容的提问来源于stack exchange,提问作者Sattar Al-Mufti

