为什么我的可执行文件上的签名仍然有效?

时间:2015-09-03 11:45:37

标签: visual-studio validation certificate authenticode trusted-timestamp

我有这个可执行文件,用vb.Net编写并编译为.Net Framework 2.0的Windows可执行文件。由于我们使用软件白名单来阻止Windows客户端上的未知软件,因此使用Visual Studio 2008 Professional workflow对此可执行文件进行了强名称和签名:

<SignFile
  CertificateThumbprint="1f 6c ... 33 b2"
  SigningTarget="$(TargetPath)"
  TimestampUrl="http://timestamp.verisign.com/scripts/timstamp.dll"
  ContinueOnError="false"
/>

为此,我们运行企业RootCA,每个公司分支机构的中间CA,以及每个分支机构CA的下方。 “我的”发行CA向我提供了一份代码签名证书,几个月前就已过期了。

因为我在工作流程中使用了Trusted Timestamp(Authenticode),所以签名在通过其文件属性检查时仍然有效,用户仍然可以在不触发Windows AppBlocker的情况下执行它。一切都很好。

现在,我被告知我的证书已被撤销,我可以通过查看crl进行验证。根据CA管理层的说法,它应该在一个月内无效,但签名仍然有效。

Serial Number: 16C40CA0000000002A60
Revocation Date: Aug 10 06:18:00 2015 GMT
CRL entry extensions:
X509v3 CRL Reason Code:
Cessation Of Operation

我认为crl中提供的原因会导致这种情况。根据{{​​3}},§4子弹1:

  

当TSA不再使用时,但TSA私钥没有   受到损害后,该机构的证书将被撤销。什么时候   reasonCode扩展相对于撤销证书的   TSA存在于CRL条目扩展中,它应设置为   未指定(0),affiliationChanged(3),取代(4)或   cessationOfOperation(5)。在那种情况下,在任何未来的时间,   使用相应密钥签名的令牌将被视为   无效,但在撤销时间之前生成的令牌将保留   有效。当reasonCode扩展相对于被撤销时   来自TSA的证书不存在于CRL条目扩展中,   然后用相应的密钥签名的所有令牌   应视为无效。因此,建议使用   使用reasonCode扩展名。

所以我的问题/问题包括:

  1. RFC 3161是否也仅适用于代码签名证书或TSA?
  2. 如果是,如果在撤销之前签名仍然有效,原因是5 CessationOfOperation?
  3. 如果是,如果证书在过期后被泄露,可以/应该使用其他原因再次撤销证书吗?仍然可能有数百个有效签名!

2 个答案:

答案 0 :(得分:2)

  1. 不,指定的RFC描述了时间戳协议和时间戳权限。它与代码签名证书无关
  2. 是的,在撤销之前签名被视为有效
  3. 证书不能多次撤销。如果它被撤销,那么它被撤销。
  4.   

    现在,我被告知我的证书已被撤销,我可以通过查看crl

    进行验证

    我认为您的证书是代码签名证书。您的应用程序仍在工作的原因是您在签署应用程序时使用了时间戳。时间戳保证您的签名是在指定时间进行的。此时您的证书有效。

答案 1 :(得分:0)

上次我调查它时,我记得如下:当启动可执行文件时,不能尝试网络连接来验证用于签名的证书是否仍然有效。此外,要使签名有效,证书在签名时必须是有效的 - 引用的RFC与此一致。除了从有效根CA证书列表中删除根CA之外,无法追溯撤销此类签名。如果您只是删除或撤销链中的某些内容,则可执行文件中捆绑的链仍将链接到根,从而进行验证。