10

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

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

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

  1. 验证签名是否有效。我相信这应该很容易使用http://msdn.microsoft.com/en-us/library/aa382384(VS.85).aspx中概述的 WinVerifyTrust - 我不希望这里有问题。

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

一种可能性是检查签名中的一些字符串。可以通过 MS 知识库文章 #323809 中的代码获得,但本文并未就此类应用程序(或任何其他)应检查哪些字段提出建议。 问题 #1072540还说明了如何获取一些证书信息,但同样不建议实际检查哪些字段。我担心字符串可能不是最好的检查:例如,如果另一个人能够获得同名的证书怎么办?或者如果我们有正当理由在未来改变字符串?

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

4

1 回答 1

4

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

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

于 2011-01-04T16:41:11.363 回答