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