我正在为我的应用程序添加自动升级。为此,我需要代码签名,否则自动升级可能是攻击的载体。我需要通过“ openssl”命令进行签名和验证,因为我的应用程序可以在任何平台上运行,并且OpenSSL在任何平台上都可用。但是,当我尝试使用openssl和从Comodo购买的代码签名证书来验证时间戳时,出现错误“验证错误:无法获取本地发行者证书”。我运行的命令如下:
首先,我使用以下命令从Comodo的.p12文件中提取私钥和证书:
openssl pkcs12 -in full-certs-from-comodo.p12 -nocerts -out private-key.pem
openssl pkcs12 -in full-certs-from-comodo.p12 -nokeys -out certs.pem
然后,要查询和验证时间戳,请运行:
openssl ts -query -data mydata.tar.gz -cert -CAfile certs.pem -sha256 -out request-256.tsq
cat request-256.tsq | curl -s -S --data-binary @- -H 'Content-Type: application/timestamp-query' 'http://timestamp.comodoca.com?td=sha256' > response-256.tsr
openssl ts -verify -sha256 -in response-256.tsr -data mydata.tar.gz -CAfile certs.pem
这是导致的完整错误:
Verification: FAILED
140710242829968:error:2F06D064:time stamp routines:TS_VERIFY_CERT:certificate verify error:ts_rsp_verify.c:246:Verify error:unable to get local issuer certificate
Comodo技术支持无法解决此问题,并且我已经与他们沟通了一个月。 Digicert说,它们只能签署某些类型的文件,而其中不包括.tar.gz文件。 *sigh*
我以前从未使用过代码签名,但是这听起来不对劲,除非Digicert添加了人为的限制。我不能对任何文件进行哈希处理,使用私钥对哈希签名,然后在用户端使用公钥对其进行验证吗?我不认为这应该这么难。我不明白吗?
无论如何,即使是与付费证书供应商合作,我也希望能够使用此功能,但失败了,我想知道是否可以创建自己的密钥对(la PGP)并使用它。我想我不能撤销证书;还有其他缺点吗?特别是,有人通过这种方式看到任何降低的安全性吗?我确实需要为此应用提供非常好的安全性。
该应用程序是Perl脚本,通常在Web服务器上运行,即通常在* nix平台上运行,但也可以在Windows上运行。
谢谢!我非常感谢有任何线索可以使这项工作以任何方式得到回报,无论有偿与否。我不能成为第一个需要这种代码签名的人,但是Comodo和Digicert技术支持似乎根本没有听说过。
答案 0 :(得分:1)
也许不是答案,但绝对不能发表评论。
此外:OpenSSL在许多平台上可用,但不是全部。尽管您只在乎可以安装应用程序的平台,但是perl已经对平台提出了很高的要求,因此无法在任何地方都可以安装。
更多重要信息:代码签名和可信时间戳是不同的,并且是分开的,尽管有时一起使用:Microsoft和Java之类的一些代码签名方案鼓励(但不要求)在(代码)签名上获得可信的时间戳。 ;我不确定Apple或Android。特别是,您不能(有效地)使用代码签名证书进行时间戳记或验证时间戳,并且如果可以获取时间戳记证书(您可能无法满足除自己以外的任何人所信任的要求,请参阅下文)您不能将其用于签名或验证代码。尽管您在ts
上遇到的错误可能不是由于这种误用,而是因为您做错了其他事,但您没有告诉我们您做了什么,并且想像并描述了您可能已经完成的许多工作错误将远远超出为一个Stack答案合理甚至是合理的答案。
证书不能限制您可以签名的内容,但是可以限制该签名将在何处受信任。特别是对于Microsoft Authenticode,只有来自Microsoft专门批准的CA的证书才有效。而且我相信Apple仅信任他们自己发行的证书。
是的,如果您同时控制两端/全部两端,则不需要“真实”证书;在已知的情况下,受信任的第三方CA的(唯一)值和来自该证书的证书允许您的系统和/或代码信任其他人的数据或代码,和/或其他人信任您的数据或代码。或多或少的合理条件。除非您Michael Garibaldi,否则您可能会完全信任自己。如果您使用OpenSSL的“原始”签名功能(命令行dgst -sign/verify
或rsautl/pkeyutl -sign/verify
或等效的库调用),则只需要两个密钥,即私有密钥和公共密钥。如果您使用CMS(又名PKCS7)或S / MIME签名,则需要 a 证书,但是它可以是带有任何身份信息(真或假)的自签名证书,您想输入它。