使用osslsigncode签名Windows安装包后显示发布者未知的问题排查
我尝试给Windows安装包做代码签名,通过GoDaddy获取证书,用osslsigncode完成签名,工具提示签名成功,但运行安装包时Windows显示发布者:未知。
我的操作步骤:
- 用OpenSSL生成证书请求:
openssl req -new -nodes -keyout mycert.key -out mycert.csr -newkey rsa:2048 - 将CSR提交给GoDaddy签名,得到
mycert.pem文件。 - 把
mycert.pem和证书链文件certchain.pem合并为combinedcert.pem。 - 生成PKCS12格式文件:
openssl pkcs12 -export -in combinedcert.pem -inkey mycert.key > mycert.p12 - 使用osslsigncode签名安装包:
osslsigncode sign -pkcs12 mycert.p12 -askpass -n "My Software" -i https://mycompanywebsite.com -h sha2 -t http://timestamp.digicert.com -in windows-installer-unsigned.exe -out windows-installer-signed.exeSucceeded
- 验证签名:
osslsigncode verify -in windows-installer-signed.exe... Message digest algorithm : SHA256
.
Signature verification: ok
etc.
Succeeded
明明签名验证通过,为什么Windows还是显示发布者未知?
可能的原因及解决方法
1. 证书链不完整或顺序错误
Windows需要完整的证书链(实体证书、中间证书、根证书)才能识别发布者,且合并顺序必须是实体证书在前,中间证书在后,根证书最后(部分根证书Windows已预装,可省略,但中间证书必须包含)。
GoDaddy的代码签名证书通常需要1-2层中间证书,比如Go Daddy Secure Certificate Authority - G2、Go Daddy Root Certificate Authority - G2。如果certchain.pem缺少中间证书,Windows无法追溯到受信任根,就会显示发布者未知。
重新合并证书的正确命令示例:
cat mycert.pem intermediate1.pem intermediate2.pem root.pem > combinedcert.pem
2. PKCS12文件未包含完整证书链
生成PKCS12时需确保导入完整证书链,可通过以下命令检查PKCS12内容:
openssl pkcs12 -info -in mycert.p12
若输出仅显示你的实体证书,需重新生成PKCS12,确保combinedcert.pem是完整链文件。
3. 时间戳服务器或哈希算法问题
更换为GoDaddy官方时间戳服务器http://tsa.starfieldtech.com,同时明确指定哈希算法为sha256(避免sha2的歧义),重新签名:
osslsigncode sign -pkcs12 mycert.p12 -askpass -n "My Software" -i https://mycompanywebsite.com -h sha256 -t http://tsa.starfieldtech.com -in windows-installer-unsigned.exe -out windows-installer-signed.exe
4. 证书类型错误
确认从GoDaddy获取的是代码签名证书(Code Signing Certificate),而非SSL服务器证书。SSL证书仅用于网站加密,无法被Windows识别为可执行文件的发布者凭证,若类型错误需重新申请代码签名证书。
5. Windows证书信任问题
若证书链中的中间/根证书未被Windows信任,需手动导入:
- 打开
certmgr.msc - 进入「中级证书颁发机构」→「证书」,右键导入中间证书文件
- 再检查安装包签名详情
6. osslsigncode版本兼容性
旧版本osslsigncode可能存在Windows兼容问题,升级至最新版本后重新签名。
另外,可通过Windows右键安装包→属性→数字签名,查看签名详情,里面会明确提示证书链是否完整、是否受信任,帮助快速定位问题。
内容的提问来源于stack exchange,提问作者springcorn

