2

在尝试自动编译和签名特定的基于 NSIS 的二进制文件时,我遇到了一些奇怪的行为。即,makensis在下运行wine以编译可执行文件,然后osslsigncode用于对二进制文件进行签名。

可执行文件似乎构建得很好,因为它适用于 Windows 系统,但是签名存在问题(缺乏更好的词)。由于代码签名证书采用 PKCS#12 格式,因此使用的命令如下所示

osslsigncode sign -pkcs12 <pkcs12-file> -pass <pkcs12-password> \ -n "Your Application" -i http://www.yourwebsite.com/ \ -in yourapp.exe -out yourapp-signed.exe

我从 osslsigncode 收到“Succeeded”消息,好像签名正常,但是当二进制文件在 Windows(本例中为 Win 7)上运行时,UAC 说:

发布者:未知

奇怪的是,当我打开从原始.p12文件中提取的证书,查看它的信息时,Windows 之后能够识别发布者和数字签名,好像它以某种方式意识到了证书路径......?

任何意见,将不胜感激。

使用的编辑 1
osslsigncode 版本:1.5.2 和 1.7.1

编辑 2
为了比较,我尝试用 签名SignTool,显然它没有任何问题。所以这看起来像 cert + osslsigncodeissue,但我不知道它到底是什么。

我还osslsigncode用另一个证书尝试了完全相同的 EXE,为了让事情更有趣,它起作用了......(我注意到 2 个证书的证书路径不同)。

一些证书详细信息:

1)非工作证书
版本:V3
公钥:RSA 2048 bits
签名哈希算法:sha1
签名算法:sha1RSA
证书路径:USERTrust -> Comodo Code Signing CA 2 -> NonWorkingCert

2)工作证书
版本:V3
公钥:RSA 2048 位
签名哈希算法:sha1
签名算法:sha1RSA
证书路径:USERTrust -> UTN-UserFirst-Object -> Comodo Code Signing CA 2 -> WorkingCert

4

1 回答 1

4

这花了我几个小时的时间,但我想我现在明白了。

  • Windows 有其内部的受信任证书数据库。这些包括根证书(由 Windows 安装和更新)和它在不同时间看到的其他中间 CA 证书(由根证书或其他一些受信任的证书签名)。
  • 当 Windows/UAC 在启动时检查可执行签名时,它会在本地数据库中查找已签署嵌入在可执行签名中的证书根的受信任证书。
  • 如果 Windows 找不到受信任的签名证书(可能是因为嵌入式证书是用中间证书而不是根证书签名的,并且中间证书不在本地数据库中),则会导致 Unknown Publisher。
  • 如果您查看可执行属性的“数字签名”选项卡,Windows 会更进一步,并尝试自动下载并安装任何受其本地证书之一信任的有效中间证书。一旦这个中间证书被添加到 Windows 的本地证书存储中,可执行文件启动时的签名检查也将开始通过(即显示正确的发布者)。(这个 MSDN 答案解释了逻辑,尽管他们描述的根本原因 - 根证书尚未更新 - 是不同的。)

解决方案是将中间证书osslsigncode与主证书一起传递。(H/T to Tor Project 确认这一点。)

  • 找到正确的中间 CA 证书。可以通过openssl x509 -text -in cert.pem然后查找“Authority Information Access -> “CA Issuers” URI 来完成。证书标识符(序列号等)也可以在 Windows 中的“数字证书”选项卡 ->“查看证书”->“认证路径”。

    (提示:不要总是相信 CA 的支持页面有正确的信息来下载哪个中间证书,我从 CA 的网页下载了错误的中间证书后浪费了很多时间。)

  • 如有必要,使用openssl x509 -in my_intermediate_ca.crt -inform der -outform pem -out my_intermediate_ca.pem或类似方法将所有证书转换为 PEM 格式。
  • 将完整的 CA 链放入一个 PEM 文件中,首先使用代码签名证书:cat mycert.pem my_intermediate_ca.pem > certchain.pem

    (如果代码签名证书不是链中的第一个,Windows 会看到由中间证书“签名”的无效签名。)

  • osslsigncode -certs certchain.pem ...

    (注意:我也通过了-h sha256&-ts http://timestamp.digicert.com虽然我认为一切都可以与其他选项组合一起使用。)

于 2018-10-03T23:39:06.417 回答