验证Authenticode签名是否来自我们公司的自动更新程序

时间:2011-01-04 15:50:33

标签: c windows cryptography digital-signature authenticode

我正在实施自动更新功能,并且需要一些有关如何使用最佳做法安全地执行此操作的建议。我想使用下载文件的Authenticode签名来验证它是否可以安全运行(即来自我们公司并且没有被篡改)。我的问题非常类似于问题#2008519。

底线问题:检查自动更新功能的Authenticode签名的最佳,最安全的方法是什么?应检查证书中的哪些字段?要求是:(1)检查签名是否有效,(2)检查签名是否有效,(3)当证书过期时,旧客户仍然可以更新,我会得到一个新签名。

以下是我的研究中的一些背景信息/想法:我相信这可以分为两个步骤:

  1. 验证签名是否有效。我认为使用WinVerifyTrust应该很容易,如http://msdn.microsoft.com/en-us/library/aa382384(VS.85).aspx中所述 - 我不认为这里存在问题。

  2. 确认签名对应于我们公司,而不是其他公司。这似乎是一个更难回答的问题:

  3. 一种可能性是检查签名中的一些字符串。可以通过MS KB文章#323809的代码获得,但是本文不会就应该为这种类型的应用程序(或任何其他类似的)检查哪些字段提出建议。 Question #1072540还说明了如何获取某些证书信息,但同样不建议实际检查哪些字段。我担心的是字符串可能不是最好的检查:例如,如果另一个人能够获得具有相同名称的证书,该怎么办?或者,如果我们有将来更改字符串的正当理由?

    question #2008519的人有着非常相似的要求。他对“TrustedByUs”功能的需求与我的相同。但是,他通过比较公钥来进行检查。虽然这可以在短期内起作用,但似乎它不适用于自动更新功能。这是因为代码签名证书最长有效期为2 - 3年。因此,将来,当我们在2年内购买新证书时,由于公钥的更改,旧客户将无法再更新。

1 个答案:

答案 0 :(得分:4)

  

有问题的人#2008519有一个   非常相似的要求。他的需要   “TrustedByUs”功能完全相同   我的。然而,他开始做   通过比较公钥进行检查。   虽然这可以在   短期来看,似乎不会   致力于自动更新功能。   这是因为代码签名   证书仅适用于2 - 3   年最大因此,在未来,   当我们在2购买新证书时   多年来,老客户不会   能够更新由于   改变公钥。

由于担心应用程序信任您而不是某人信任您,您可以使用自签名并嵌入应用程序本身所需的任何公钥。这使您可以更好地控制该过程。当要求不受您控制的用户或应用程序提供信任时,这是不合适的,但在这种情况下,应用程序在您的控制之下,因此它可以正常工作。这使您可以非常轻松地避免将其他人的类似外观证书误认为您自己的问题。