我正在实现自动更新功能,需要一些关于如何使用最佳实践安全地执行此操作的建议。我想使用下载文件的 Authenticode 签名来验证它是否可以安全运行(即来自我们公司并且没有被篡改)。我的问题与问题#2008519 非常相似。
底线问题:检查 Authenticode 签名以获得自动更新功能的最佳、最安全的方法是什么?应该检查证书中的哪些字段?要求是:(1)检查签名是否有效,(2)检查它是我的签名,(3)当我的证书过期并且我得到一个新的时,旧客户端仍然可以更新。
以下是我研究的一些背景信息/想法:我相信这可以分为两个步骤:
验证签名是否有效。我相信这应该很容易使用http://msdn.microsoft.com/en-us/library/aa382384(VS.85).aspx中概述的 WinVerifyTrust - 我不希望这里有问题。
验证签名对应于我们公司,而不是其他公司。这似乎是一个更难回答的问题:
一种可能性是检查签名中的一些字符串。可以通过 MS 知识库文章 #323809 中的代码获得,但本文并未就此类应用程序(或任何其他)应检查哪些字段提出建议。 问题 #1072540还说明了如何获取一些证书信息,但同样不建议实际检查哪些字段。我担心字符串可能不是最好的检查:例如,如果另一个人能够获得同名的证书怎么办?或者如果我们有正当理由在未来改变字符串?
问题#2008519的人有一个非常相似的要求。他对“TrustedByUs”功能的需求与我的相同。但是,他通过比较公钥来进行检查。虽然这在短期内可行,但它似乎不适用于自动更新功能。这是因为代码签名证书的有效期最长为 2 - 3 年。因此,未来我们在2年后购买新证书时,由于公钥的变化,旧客户端将无法再更新。