c - 验证 Authenticode 签名是否来 self 们公司,用于自动更新程序

标签 c windows cryptography digital-signature authenticode

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

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

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

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

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

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

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

最佳答案

The person at question #2008519 has a very similar requirement. His need for a "TrustedByUs" function is identical to mine. However, he goes about doing the check by comparing public keys. While this would work in the short-term, it seems like it won't work for an automatic update feature. This is because code signing certificates are only valid for 2 - 3 years max. Therefore, in the future, when we buy a new certificate in 2 years, the old clients wouldn't be able to update any more due to the change in public key.

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

关于c - 验证 Authenticode 签名是否来 self 们公司,用于自动更新程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4595537/

相关文章:

java - PHP vs JAVA AES 加密,有什么区别?

c - 当文件达到一定大小时,如何暂停文件写入,然后创建一个新文件

c - 难以理解 c 中的 fork()

windows - Ansible win_shell 临时语法

c# - WPF DataGrid 列 TextWrapping 以编程方式

windows - 在 64 位 Windows Server 2008 Standard SP2 IIS 7 上注册 dll

将结构复制到相同类型结构的数组中

c - Unix 和信号处理程序 (C)

c - 对 'SHA1' 的 undefined reference

c# - 尝试导出 X509 私钥的 RSAParameters 时出现 CryptographicException "Key not valid for use in specified state."