自动更新下载最新的.exe文件 - 如何验证它没有被篡改?

时间:2012-04-25 21:39:52

标签: c# code-signing

我们有一个小型控制台应用程序(200kb以下)将分发给客户端,我们希望确保它们运行最新版本(由WCF服务验证)。目前,它通过HTTPS下载新的.exe文件,并用它替换当前的.exe文件。

假设我们的服务器没有受到损害,那就没关系。但是,我们还使用代码签名证书对我们的.exe文件进行签名。有没有办法验证这个并删除文件,如果它不匹配?我们需要能够验证并删除该文件,而不管它是否是病毒。

我们如何验证我们签名的.exe文件?例如,Windows将显示它是否无效: Failed Digital Signature

编辑:这段代码能完成这项工作吗?

X509Certificate basicSigner = X509Certificate.CreateFromSignedFile(file);
X509Certificate2 cert = new X509Certificate2(basicSigner);
if (cert.Subject.Contains("CN=MY COMPANY NAME IN CERTIFICATE"))
    valid = true;

编辑:如果我们也检查StrongNameSignatureVerificationEx,如果文件中的一位被更改,则返回失败。也许这就足够了?

[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
        static extern bool StrongNameSignatureVerificationEx(string wszFilePath, bool fForceVerification, ref bool pfWasVerified); 

编辑:我也实现了这个代码,在 WinTrust.dll 中调用 WinVerifyTrust 来实际验证Authenticode签名:http://www.pinvoke.net/default.aspx/wintrust.winverifytrust

现在,它检查数字签名是否包含正确的主题,是否来自有效的受信任根,签名是否有效以及代码是否以其数字签名命名。这现在必须足够安全吗?

2 个答案:

答案 0 :(得分:3)

This是一个很好的演练,包括可用于实现您想要的选项的源代码......

基本上,您需要对StrongNameSignatureVerificationEx 进行转发,因为没有托管API可以满足您的需求。

另一种选择可能是call SignTool

答案 1 :(得分:1)

这是一个非常错误的方法。代码签名证书唯一证明的是签署EXE的个人或公司的身份。证书颁发机构仅证明身份有效。你没有证明的是它是你的证书,你只证明它是某人的证书。攻击者可以用另一个由他签名的EXE替换你的EXE。

你可能会反对“但我不能只是确认它是我的!”。答案是否定的,如果攻击者可以替换EXE那么他也可以更换你的支票代码。在同一台机器上执行验证没有任何安全性。

代码证书仅用于一个目的,它们向用户证明签名者的身份。让他们做任何其他事情都是一个安全漏洞。非常糟糕的那种,让你感觉你的系统是安全的。并且让您不再考虑实施真正的安全性。