代码签名证书过期时会发生啥?

Posted

技术标签:

【中文标题】代码签名证书过期时会发生啥?【英文标题】:What happens when a code signing certificate expires?代码签名证书过期时会发生什么? 【发布时间】:2010-09-24 16:05:27 【问题描述】:

我正在考虑从 VeriSign 或 Thawte 购买代码签名证书来签署 XBAP。我的问题是:该证书到期时会发生什么? 299 美元和 599 美元对于 1 年/2 年证书来说是相当高的价格,如果我必须在证书到期时向我的客户交付新签名的版本,那么我只需处理创建自己的证书的麻烦现在。

我不喜欢创建自己的证书的地方在于难以将其分发到将使用我的 XBAP 的所有客户端计算机。我的应用程序只会在 LAN 上使用,所以我想我总是可以使用 Windows Installer 来安装我自制的证书(虽然我不确定如何做到这一点 - 任何人都有任何想法吗?)。

如果我交付的是部分信任的应用程序,这真的不是问题 - 但我的应用程序需要 Web 权限,因为它将与 WCF 服务通信,所以它处于部分信任和完全信任之间的灰色区域,如果没有证书,我会在尝试加载 XBAP 时收到有趣的 ole Trust Not Granted 消息。

有什么想法吗?

【问题讨论】:

www.CACert.org 是一个非营利组织,免费向受信任的个人提供代码签名证书。 FF 消息:“www.cacert.org 使用了无效的安全证书。该证书不受信任,因为颁发者证书未知。” 使用 KSoftware。站立的家伙,已经存在多年了,我个人认识他。 codesigning.ksoftware.net Comodo 在业内非常有名。他们以每年 70.83 美元的价格出售 code signing certificates。也是mentioned by BCran below。 【参考方案1】:

如果您在证书有效时为您的代码添加时间戳,则您的过期证书是好的。

来自Thawte Code Signing Certificate FAQs:

我可以使用代码签名证书多长时间?

代码签名证书的有效期为 1 年或 2 年,具体取决于您在购买证书时选择的生命周期。请注意:对于 Microsoft® Authenticode®(多用途),您还应该为您的签名代码添加时间戳,以避免您的代码在您的证书过期时过期。

带时间戳的代码在代码签名证书过期后是否有效?

Microsoft® Authenticode® (Multi-Purpose) 允许您为签名代码添加时间戳。时间戳确保在证书过期时代码不会过期,因为浏览器会验证时间戳。时间戳服务由 VeriSign 提供。如果您在签署代码时使用时间戳服务,您的代码的哈希将被发送到 VeriSign 的服务器以记录您的代码的时间戳。用户的软件可以区分使用不应信任的过期证书签名的代码和使用在代码签名时有效但随后已过期的证书签名的代码。

【讨论】:

这当然是正确答案。您需要使用受信任的对等点和数字时间戳,以便您的应用在签名后保持有效。 如果在代码过期后查看二进制的属性,它是否还有数字签名选项卡? 请注意下面我的 Windows Defender 答案。你不希望你的证书过期,所以买一个 10 年的。【参考方案2】:

注意设置了 WTD_LIFETIME_SIGNING_FLAG 的证书:这意味着(尽管您介意从名称中假设)使用该证书签名的程序在证书过期后无效,即使该程序没有t改变了,证书在签名时是有效的。

这也会影响更新,因为即使客户选中该框以信任您公司的所有程序,如果您的更新程序没有使用相同的证书签名(或该证书过期),那么信任就会失败。

来自: http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx


使用生命周期签名语义处理时间戳

不希望时间戳签名无限期成功验证的应用程序或证书颁发机构有两种选择:

• 在发布者的签名证书中设置生命周期签名者 OID。

如果发布者的签名证书除了包含 PKIX 代码签名 OID 之外,还包含生命周期的签名者 OID,则在发布者的签名证书过期时,即使签名带有时间戳,签名也会失效。生命周期签名者 OID 定义如下:

szOID_KP_LIFETIME_SIGNING 1.3.6.1.4.1.311.10.3.13

• 调用 WinVerifyTrust 时在 WINTRUST_DATA 结构中设置 WTD_LIFETIME_SIGNING_FLAG。

如果 WinVerifyTrust 调用方在 WINTRUST_DATA 结构中设置 WTD_LIFETIME_SIGNING_FLAG 并且发布者的签名证书已过期,则 WinVerifyTrust 会报告签名无效,即使签名带有时间戳。

如果发布者撤销包含生命周期签名者 OID 的代码签名证书,或者 WinVerifyTrust 调用者在 WINTRUST_DATA 结构中设置 WTD_LIFETIME_SIGNING_FLAG,则 WinVerifyTrust 将在满足以下两个条件时报告签名有效:

• 签名在撤销日期之前加盖时间戳。

• 签名证书仍在有效期内。有效期过后,签名失效。


例如: https://forum.startcom.org/viewtopic.php?f=15&t=2215&p=6827&hilit=lifetime+signing#p6827

这是 StartSSL 证书的一个严重问题。成本如此之低的证书中存在限制并不让我感到惊讶,但是将这种限制隐藏在细则或旧论坛帖子中而不是在产品描述中明确说明是一项糟糕的业务。他们可能会在未来修复它,而其他人可能有也可能没有同样的限制,因此在您花钱之前检查电子邮件可能是明智的。

猜猜谁不知道要问?大声笑...哦,好吧,生活和学习。

【讨论】:

startcom 论坛链接已失效。这是存档版本:web.archive.org/web/20160405182742/https://forum.startcom.org/… 所以......它确实与名称所暗示的相反。由微软设计?【参考方案3】:

如果您确保在签署二进制文件时添加时间戳,则无需在证书到期时重新签署它们。只需在signtool的命令行中添加“/t http://timestamp.verisign.com/scripts/timstamp.dll”,数字签名将始终被标记为有效,除非证书被吊销且CA受信任。

代码签名证书如此昂贵的原因是有人必须验证你是你所说的那个人。就我而言,他们验证了地址和电话号码,并给我打电话。不过,Comodo 的证书似乎要便宜一些。

【讨论】:

有人可以确认上面提供的 VeriSign 时间戳 URL 仅对 VeriSign 证书有效吗?这是我的假设。 Will:不,它适用于任何供应商的证书。我已将它与我的 Globalsign 证书一起使用。 timestamp.dll的链接打不开。 @tedyyu 见Is the Verisign Timestamp server down?【参考方案4】:

如果您打算在封闭 (LAN) 环境中使用它,您应该设置自己的 CA。 Windows Server 版本包括易于使用的证书颁发机构,但更简单的是通过 openssl 提供的 demoCA 设置最小 CA,它由几个脚本组成。您可以在 Windows 上的 Cygwin 或 natively 中运行 openssl demoCA。这个 demoCA 由几个 perl/bash 脚本组成,这些脚本调用 openssl 命令来生成请求、签署证书/crls 等。

当您拥有自己的 CA 时,您需要安装的是您的 CA 根证书,这样更新用户证书就不会再麻烦了,因为 CA 证书将保持不变。通常,CA 证书的有效期应为 5-10 年,但您可以随意配置(请记住,它是您自己的 CA)。

CA 证书将安装在每台客户端计算机上。如果您的应用程序信任 Windows 系统安全性,则应将其安装在 IExplorer 证书颁发机构密钥库中。如果您使用 Java 应用程序,那么您应该在您使用的 Java 密钥库中分发 CA 证书。

【讨论】:

谢谢费尔南多——不过我有点困惑——如何在每台客户端计算机上安装 CA 证书?必须手动完成吗? 所有信息都很好,但是“代码签名证书过期后会发生什么?” 简单,您的签名(代码或其他)不再有效,因为证书甚至没有通过本地验证(到期日期是要检查的证书的首要特征之一) 是的,我发现如果您想避免每 X 年重新签署一次代码,您需要使用数字时间戳服务。 ***.com/questions/912955/… 其次,证书可以简单地更新吗? -- 或者您是否必须重建/重新签署代码,并让人们安装您产品的新版本?【参考方案5】:

刚刚遇到这个问题。我找到了in this article 的解释,并与@BCran's answer 一起解决了它。总结:

证书默认需要在validation期间有效(客户端打开程序时,而不是编译时) 要使证书永久有效,您需要使用 TimeStamping 服务器对程序进行签名。这可以证明您没有更改计算机时间并使用旧证书。如果您使用 TimeStamping 服务器,则无需每次都为您的代码签名。

这就是你在 VS.NET 2017 中的做法,例如:

如果网址不起作用,您可以使用任何服务,这里有一堆有效的网址:https://***.com/a/9714864/72350

【讨论】:

【参考方案6】:

当心 WINDOWS 防御者。

您永远不希望您的证书过期,或者尽可能长,这似乎是 10 年。

一旦您的证书过期,Windows 将无法识别替换证书。您的申请排在队列的末尾,就好像它是由完全不同的组织签署的一样。

这意味着用户在下载时会收到讨厌的消息,并且可能根本无法运行您的代码,具体取决于组策略。这种情况会一直持续下去,直到大量不同的人忽略了可怕的警告并安装了您的软件。

当然,时间戳服务器将使现有程序在证书过期后运行,但升级将是一个问题。

这对于本地使用的软件来说不是问题,但如果您想广泛分发您的软件,这将是一个大问题。

【讨论】:

【参考方案7】:

BCran 写道:“代码签名证书如此昂贵的原因是有人必须验证你就是你所说的那个人。”

称我为愚蠢,但有没有人想过开发人员可以在构建时自行计算其可执行应用程序的确切大小以及是否在计算的数字中包含开发人员的身份,插入与应用程序加密形式的哈希数,并决定是否对应用程序进行时间限制或使其永久运行(因为用户机器上已经存在的可执行代码不太可能在 1、3、 5、10、100、100 万年)?

此外,如果有人可以验证您的电话号码和/或地址,也没有任何区别。如果开发人员选择,这些东西可以很容易地改变,但应用程序的代码不会。

优势: 开发人员执行此任务不需要任何费用。同时,只要用户希望使用(或开发者允许使用),用户仍然可以放心使用有效且安全的应用程序,并且应用程序不会被篡改。或者苹果和微软等大玩家和证书颁发者是否必须诱使开发人员接受为这项服务持续付费?

注意:我对代码签名应用的天真和原始理解是防止任何人篡改应用的代码。但我越是看这个,它看起来更像是第三方个人和组织从开发人员那里赚钱的机会,从富人那里赚钱。好吧,总得有人去做,试图找出你是谁。但是我在互联网上看到的这项服务的价格差异很大,而且如此强调 1 年或 3 年的期限而没有永久签名应用程序的选项,这表明我们有一些人在城市里有非常昂贵的办公室来支付他们的费用租金和他们高昂的薪水。

为什么开发人员不要求 Apple 和 Microsoft 的安全解决方案类型对开发人员的口袋更加友好,并且对用户同样安全可靠?或者在下载时在开发者的网站上给出最终安装程序文件的确切大小(以字节为单位),用户可以检查。所陈述的任何额外或丢失的字节都应该足以告诉用户存在问题。强制开发人员拥有自己的网站,以便每个人都可以看到他们是谁以及从哪里获得合法且未经篡改的软件副本,并杜绝软件下载网站抓取开发人员软件的副本以从他们的网站下载。一切都应该在开发者的网站上完成,而不是其他地方。

【讨论】:

【参考方案8】:

代码签名证书不是“托管”的,这意味着它们不会自行更新...一旦过期,您可能必须购买新证书。 您可以设置一个证书颁发机构 (CA) - 如果您是一家仅限 Windows 的商店,请坚持使用基于 Windows 的 CA,否则我建议您使用类似 DogTag Certificate System 的 Linux。 请注意,如果您创建自己的 CA,则需要导出公共 CA 证书并将其安装(因此它作为根 CA 被信任)将运行由该颁发的代码签名证书签名的代码/脚本的任何服务器加利福尼亚州。与每 X 年支付一次证书相比,这要便宜得多(免费?)——更不用说您可以出于各种原因/用途颁发的其他证书!

【讨论】:

以上是关于代码签名证书过期时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

代码签名问题:开发者证书已过期,求助?

Android - 签名密钥过期时会发生啥?

使用 CERTENROLLLib 的自签名证书,证书已过期状态

当一个 APK 有两个签名并且有一个签名的升级可用时会发生啥?

证书过期的试飞

代码签名证书有啥特别之处?