代码签名证书过期后会发生什么?

60

我正在考虑从VeriSign或Thawte购买代码签名证书,用于给XBAP进行签名。我的问题是:当证书过期时会发生什么?1年/2年证书的价格非常高昂,如果每次证书到期都必须向客户交付新的已签名版本,那么我现在就只能自己创建证书了。

我不喜欢自己创建证书的原因是在将其分发到将使用我的XBAP的所有客户端机器上时存在困难。我的应用程序只会在局域网上使用,所以我想我可以始终使用Windows Installer来安装我的自制证书(尽管我不确定如何操作-有人有什么想法吗?)。

如果我要发布部分信任的应用程序,这并不是一个问题,但我的应用程序需要Web权限,因为它将要与WCF服务通信,所以它处于部分信任和完全信任之间的灰色地带。没有证书,我会收到“Trust Not Granted”消息,无法加载我的XBAP。

有什么想法吗?


2
www.CACert.org 是一个非营利性组织,向可信赖的个人免费提供代码签名证书。 - cjakeman
使用KSoftware。这是一个可靠的人,已经存在多年,我个人认识他。https://codesigning.ksoftware.net - Nico Westerdale
Comodo在业界非常有名。他们以每年70.83美元的价格销售代码签名证书。它也被BCran提到(参见https://dev59.com/QnRC5IYBdhLWcg3wVvjL#3410212)。 - Franklin Yu
8个回答

93
如果您在证书有效期内给代码打上时间戳,那么过期的证书也是有效的。
来自Thawte代码签名证书FAQ
代码签名证书的有效期有多长?
代码签名证书的有效期为1年或2年,具体取决于您购买证书时选择的生命周期。请注意:对于Microsoft® Authenticode®(多用途),您还应该为签名代码打上时间戳,以避免证书过期后代码过期。
代码打上时间戳后,过期的代码是否仍然有效?
Microsoft® Authenticode®(多用途)允许您为签名代码打上时间戳。时间戳确保代码在证书过期时不会过期,因为浏览器验证时间戳。时间戳服务由VeriSign提供。如果您在签署代码时使用时间戳服务,则会将您代码的哈希值发送到VeriSign的服务器以记录代码的时间戳。用户的软件可以区分用过期证书签名的代码和用后来过期的证书签名但在签名时是有效的证书签名的代码。

1
这当然是正确的答案。你需要使用可信的同行和数字时间戳,以便在签名后您的应用程序保持有效。 - Gui13
代码过期后,如果您查看二进制文件的属性,它是否仍然具有数字签名选项卡? - Kyle Delaney
1
请注意我的Windows Defender答案。您不希望您的证书过期,因此请获取一个十年有效期的证书。 - Tuntable

31
注意带有WTD_LIFETIME_SIGNING_FLAG设置的证书:尽管程序未更改,且签署证书在签署时有效,但意味着使用证书签署的程序在证书过期后将变为无效。这也会影响更新,即使客户勾选了信任贵公司所有程序的框,如果您的更新程序未使用相同的证书进行签名(或该证书已过期),则信任将失败。
来源: 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证书的一个严重问题。我并不惊讶于这么便宜的证书有限制,但是将此限制隐藏在细则或旧的论坛帖子中,而不是在产品说明中明确说明,这是一种糟糕的商业做法。他们可能会在未来修复它,其他人可能会或可能不会有相同的限制,因此在花钱之前发送电子邮件进行检查可能是明智的选择。
猜猜谁不知道要问?哈哈...好吧,活着就是学习。

所以...它实际上与名称所暗示的相反。由微软设计? - Suncat2000

13
如果您在签署二进制文件时添加时间戳,当证书过期时就不必再次签署。只需在signtool的命令行中添加“/t http://timestamp.verisign.com/scripts/timstamp.dll”,数字签名将始终被标记为有效,除非证书被吊销且CA受信任。
代码签名证书之所以如此昂贵,是因为有人必须验证您是您所说的那个人。在我的情况下,他们验证了地址和电话号码,并给我打了电话。Comodo的证书似乎略微便宜一些。

有人能确认上面提供的VeriSign时间戳URL仅适用于VeriSign证书吗?这是我的假设。 - Will Bickford
3
Will:不,它适用于任何供应商的证书。我曾经使用过它和我的Globalsign证书。 - BCran
时间戳.dll的链接无法打开。 - tedyyu
@tedyyu 请查看Verisign时间戳服务器是否宕机? - Franklin Yu

7
如果您计划在封闭(LAN)环境中使用它,您需要设置自己的CA。Windows Server版本包括易于使用的认证机构,但更简单的方法是通过openssl提供的demoCA设置最小的CA,其中包括多个脚本。您可以在Windows上使用Cygwinnatively运行openssl demoCA。这个demoCA由几个perl/bash脚本组成,调用openssl命令来生成请求、签名证书/撤销列表等。
当您拥有自己的CA时,您需要安装的是您的CA根证书,这样就不需要再更新用户证书,因为CA证书将保持不变。通常,CA证书应该持续5-10年,但您可以配置多长时间(请记住,这是您自己的CA)。
CA证书将安装在每台客户机上。如果您的应用程序信任Windows系统安全性,则应安装在IExplorer证书颁发机构密钥库中。如果您使用Java应用程序,则应在您使用的Java密钥库中分发CA证书。

47
所有的信息都很好,但是“代码签名证书过期时会发生什么?” - Bratch
1
很容易,你的签名(代码或其他)不再有效,因为证书甚至在本地验证中都无法通过(到期日期是要检查的第一个证书特征)。 - Fernando Miguélez
1
是的,我发现如果你想避免每隔X年就需要重新签署代码,你需要使用数字时间戳服务。https://dev59.com/fXNA5IYBdhLWcg3wjOve - Bratch
因此,当证书过期时,您不仅不能签署新代码,而且旧的已签署代码也将无效,对吗? - BrainSlugs83
1
其次,证书可以简单地更新吗?还是必须重新构建/签署代码,并让人们安装您产品的新版本? - BrainSlugs83
显示剩余2条评论

2
我遇到了这个问题。我在这篇文章中找到了解释,并结合@BCran的答案解决了它。总结:
  • 证书默认需要在验证期间有效(客户端打开程序时,而不是编译时)
  • 为了让证书永久有效,您需要使用时间戳服务器签署程序。这将验证您没有更改计算机的时间并使用旧证书。如果您使用时间戳服务器,则无需每次重新签署代码。

例如,在VS.NET 2017中,您可以按照以下步骤执行:

code signing visual studio 2017

如果链接无法使用,您可以使用任何服务,下面是一些可用的链接:https://dev59.com/LGkw5IYBdhLWcg3wrsrn#9714864


0

注意Windows Defender。

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

一旦您的证书过期,Windows将不会将替换证书识别为原有证书。您的应用程序将排队到末尾,就好像它是由完全不同的组织签署的。

这意味着如果用户下载您的软件,他们将收到令人讨厌的消息,并且根据组策略可能无法运行您的代码。这将持续到大量不同的人忽略了严重警告并安装了您的软件。

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

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


-1

BCran说:“代码签名证书之所以如此昂贵,是因为必须有人验证您就是您所说的那个人。”

请原谅我的愚蠢,但是否有人想过这样一个想法:开发人员可以在构建应用程序时自行计算其精确大小,并决定是否将开发人员的身份与计算出的数字一起插入加密形式的哈希值到应用程序中,并决定是否限制应用程序的使用时间或使其永久工作(因为已经在用户机器上的可执行代码不太可能在1、3、5、10、100、100万年后自行恶化或更改)?

此外,验证电话号码和/或地址并没有任何区别。如果开发人员选择更改这些信息,这些信息很容易更改,但应用程序的代码则不能。

优点: 开发人员执行此任务不需要任何费用。同时,只要用户希望使用该应用程序(或被开发人员允许使用),并且应用程序保持未被篡改,用户仍然可以确保有效和安全的应用程序。或者必须像苹果和微软以及证书颁发机构一样,诱导开发人员不断接受支付此服务的要求吗?

注意:我天真而最初的理解是,代码签名应用程序的目的是防止任何人篡改应用程序的代码。但是,我越看越觉得这更像是第三方个人和组织从富人和不那么富有的开发者身上赚钱的机会。好吧,有人必须尝试找出你是谁。但是,我在互联网上看到的价格差异如此之大,以及对1或3年期限如此强调,没有永久终身签名应用程序的选择,这表明我们有一些人在城市中拥有非常昂贵的办公室,以支付他们的租金和高额薪水。

为什么开发人员不要求苹果和微软提供对开发人员口袋更友好且同样安全的安全解决方案?或者在开发人员的网站上下载时给出最终安装程序文件的确切字节大小,用户可以进行检查。从所述内容中增加或减少的任何字节都足以告诉用户存在问题。强制开发人员拥有自己的网站,以便每个人都可以看到他们是谁以及从哪里获取合法且未被篡改的软件副本,并结束软件下载站点从其站点下载开发人员软件的情况。所有操作都应从开发人员的网站上进行,而不是其他任何地方。


-2

代码签名证书是不可“管理”的,这意味着它们不会自行更新...很有可能在到期后你需要购买一个新的。

你可以设置认证机构 (CA) - 如果你只使用windows系统的话,建议选择基于windows的CA,但如果不是的话,我建议使用像DogTag Certificate System这样的Linux工具。

请注意,如果您创建自己的CA,您需要导出公共CA证书并安装它(以使其作为根CA受信任)在任何运行由该CA发行的已签名代码/脚本的服务器上。与每隔X年支付证书相比,这要便宜得多(甚至免费?)-更不用说您可以为各种原因/用途发行的其他证书了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接