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

时间:2008-11-30 21:32:36

标签: certificate code-signing xbap

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

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

如果我提供部分信任应用程序,这不会是一个问题 - 但我的应用程序需要Web权限,因为它将与WCF服务进行通信,因此它处于部分信任和完全信任之间的灰色区域,在没有证书的情况下,当我尝试加载XBAP时,我得到了那种有趣的“信任未授予”消息。

有什么想法吗?

9 个答案:

答案 0 :(得分:75)

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

来自Thawte Code Signing Certificate FAQs

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

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

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

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

答案 1 :(得分:25)

注意设置了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证书的一个严重问题。我并不感到惊讶的是,证书的成本如此之低有限制,但在细则或旧论坛帖子中埋没这一限制而不是在产品描述中明确表示业务不佳。他们可能会在将来修复它,而其他人可能会或可能不会有相同的限制,因此在您花费之前要检查的电子邮件可能是明智的。

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

答案 2 :(得分:10)

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

代码签名证书如此昂贵的原因是,有人必须验证您是否是您所说的人。在我的情况下,他们验证了地址和电话号码,并打电话给我。但是,Comodo的证书似乎稍微便宜了。

答案 3 :(得分:7)

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

当您拥有自己的CA时,您需要安装的是CA根证书,因此更新用户证书将不再有麻烦,因为CA证书将保持不变。通常,CA证书应该持续5到10年,但您可以根据需要进行配置(请记住它是您自己的CA)。

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

答案 4 :(得分:0)

只是有这个问题。我找到了in this article的解释,并与@BCran's answer一起解决了。摘要:

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

例如,这是您在VS.NET 2017中的处理方式:

code signing visual studio 2017

如果该网址无效,则可以使用任何服务,以下是一些有效的网址:https://stackoverflow.com/a/9714864/72350

答案 5 :(得分:0)

注意WINDOWS防御程序。

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

一旦您的证书过期,Windows将不会这样识别替换证书。您的应用程序将进入队列的末尾,就像它是由完全不同的组织签署的一样。

这意味着用户下载后将收到讨厌的消息,并且可能完全无法运行您的代码,具体取决于组策略。这将继续下去,直到许多不同的人忽略了可怕的警告并安装了您的软件。

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

这不是本地使用的软件的问题,但如果要广泛分发软件,则是一个大问题。

答案 6 :(得分:0)

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

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

此外,如果有人可以验证您的电话号码和/或地址,也没有任何区别。如果开发者愿意,这些事情可以很容易地改变,但应用的代码却不能。

优势: 开发人员执行此任务无需任何费用。同时,只要用户希望使用它(或被开发者允许使用它),并且该应用程序不会被篡改,他们仍然可以确保一个有效和安全的应用程序。还是必须像苹果和微软这样的大玩家和证书发行商哄骗开发者接受持续为这项服务付费?

注意:我对代码签名应用的幼稚和原始理解是防止任何人篡改应用代码。但是我越看越觉得这是第三方个人和组织从开发人员那里赚钱的机会,从富人和不那么富有的人那里赚钱。好吧,必须有人努力找出你是谁。但是我在互联网上看到的这项服务的价格差异巨大,而且非常强调 1 年或 3 年期限,而且没有永久终身签名的应用程序选项,这表明我们有人在城里拥有非常昂贵的办公室来支付他们的费用。租金和他们的高薪。

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

答案 7 :(得分:-2)

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

您可以设置证书颁发机构(CA) - 如果您是仅限Windows的商店,请坚持使用基于Windows的CA.否则我建议使用类似DogTag Certificate System的Linux。

请注意,如果您创建自己的CA,则需要导出公共CA证书并在任何将运行由该代码签名证书签名的代码/脚本的服务器上安装该证书(因此它被称为根CA)。 CA.与每X年支付一次证书相比,这远远便宜(免费?) - 更不用说您可以出于各种原因/用途发布的其他证书了!

答案 8 :(得分:-2)

您应该避免对签名过程加时间戳,或者在证书有效期内对其加盖时间戳。 Sign PE等工具允许您控制这些参数