使用 OpenSSL 对 .tar.gz 文件进行跨平台代码签名?

Posted

技术标签:

【中文标题】使用 OpenSSL 对 .tar.gz 文件进行跨平台代码签名?【英文标题】:Cross-platform code-signing of .tar.gz file using OpenSSL? 【发布时间】:2018-08-15 22:36:27 【问题描述】:

我正在向我的应用程序添加自动升级。我需要为此进行代码签名,否则自动升级可能是攻击媒介。我需要使用“openssl”命令进行签名和验证,因为我的应用程序可以在任何平台上运行,并且 OpenSSL 在任何平台上都可用。但是,当我尝试使用从 Comodo 购买的代码签名证书使用 openssl 验证时间戳时,我收到错误“验证错误:无法获取本地颁发者证书”。我运行的命令如下:

首先,我从 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 添加人为限制。我不能对任何文件进行哈希处理,用私钥对哈希进行签名,然后在用户端使用公钥对其进行验证吗?我认为不应该这么难。我不明白什么?

无论如何,即使是付费证书供应商,我也希望能够使用它,但是如果我无法创建自己的密钥对(a la PGP)并使用它,我会想知道。我想我无法吊销证书;还有其他缺点吗?特别是,有没有人看到这样做会降低安全性?我确实需要为这个应用提供非常好的安全性。

该应用程序是一个 Perl 脚本,通常在 Web 服务器上运行,即通常是 *nix 平台,但也可以在 Windows 上运行。

谢谢!我很欣赏任何让这个工作的线索,以任何方式,支付与否。我不可能是第一个需要这种代码签名的人,但 Comodo 和 Digicert 技术支持似乎根本没有听说过。

【问题讨论】:

【参考方案1】:

也许不是答案,但对于 cmets 来说肯定太多了。

另外:OpenSSL 在许多平台上都可用,但不是全部。尽管您只关心可以安装应用的平台,而 perl 对平台的要求已经很高,无法安装在任何地方。

更重要的是:代码签名和可信时间戳是不同且独立的事物,尽管有时会一起使用:一些代码签名方案(如 Microsoft 和 Java)鼓励(但不要求)您在(代码)签名上获得可信时间戳;我不确定是苹果还是安卓。特别是您不能(有效地)使用代码签名证书进行时间戳或验证时间戳,如果您可以获得时间戳证书(您可能无法满足除您自己之外的任何人信任的要求,请参见下文)您不能将其用于签名或验证代码。尽管您在ts 上遇到的错误可能不是因为这种滥用,而是因为您做错了其他事情,但是您没有告诉我们您做了什么,并且想象和描述您可能做错的很多事情会采取的措施远远超过了一个 Stack 答案的合理性,甚至适合于一个 Stack 答案。

证书不能限制您可以签署的内容,但它可能会限制信任该签名的位置。特别是对于 Microsoft Authenticode,只有来自 Microsoft 专门批准的 CA 的证书才能工作。而且我相信苹果只信任他们自己颁发的证书。

是的,如果您控制两端/所有端,则不需要“真正的”证书;受信任的第三方 CA 及其证书的(唯一)价值是允许您的系统和/或代码信任其他人的数据或代码,和/或其他人信任您的数据或代码,在已知的情况下和或多或少的合理条件。你大概完全相信自己,除非你是Michael Garibaldi。如果您使用 OpenSSL 的“原始”签名功能(命令行 dgst -sign/verifyrsautl/pkeyutl -sign/verify,或等效的库调用),您只需要两个密钥,私有密钥和公共密钥。如果您使用 CMS(又名 PKCS7)或 S/MIME 签名,则需要 a 证书,但它可以是带有任何身份信息的自签名证书,无论是真是假,您都喜欢放入它。

【讨论】:

啊,很抱歉遗漏了——我刚刚编辑了原始帖子以包含我运行的 openssl 命令。有趣的是,我需要不同的证书来进行代码签名和时间戳;我没有意识到这一点。我需要两者都做。

以上是关于使用 OpenSSL 对 .tar.gz 文件进行跨平台代码签名?的主要内容,如果未能解决你的问题,请参考以下文章

linux 可以openssl吗

编译与安装 OpenSSL

openssl 升级到1.0.1g

低价Centos7_源码编译安装OpenSSL(openssl-1.1.1.tar.gz).rar

Ubuntu 16.04.4 LTS下安装OpenSSL

ubuntu 安装 nginx