【问题标题】:Verify Authenticode signature as being from our company for automatic updater验证 Authenticode 签名为来自我们公司的自动更新程序
【发布时间】:2011-06-03 11:47:27
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 跟进:我或多或少地遵从了 Brian 的建议。 (1) 使用 WinTrustVerify 验证 Authenticode 签名,(2) 检查 Authenticode 签名的主题;确保字符串与我的公司名称匹配,(3) 作为附加措施,我使用 DSA 单独签名。签名与可执行文件一起发送并检查。

标签: c windows cryptography digital-signature authenticode


【解决方案1】:

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

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

【讨论】:

  • 自动更新程序将使用用户最初从我们的网站下载软件时使用的相同安装程序。当应用程序已经使用已知的自签名公钥安装时,自签名解决方案可以工作。当他们被问到是否通过 Windows/Web 浏览器运行下载的程序时,初始下载怎么办?为此,它必须由受信任的根 CA 签名。也许(有可能吗?)EXE 由自签名和从根 CA 购买的证书进行签名......??
  • @James:您可以轻松地将自签名签名放在单独的文件中。您可以完全控制服务器和自动更新程序之间的通信。
猜你喜欢
  • 2018-10-20
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多