2

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

假设我们的服务器没有受到损害,这没问题。但是,我们也使用代码签名证书对我们的 .exe 文件进行签名。有没有办法验证这一点并在文件不匹配时删除文件?我们需要能够验证和删除文件而无需执行它,以防它是病毒。

我们如何验证我们签名的 .exe 文件?例如,Windows 将显示它是否无效: 失败的数字签名

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

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

现在,它检查数字签名是否包含正确的主题、来自有效的受信任根、签名是否有效以及代码是否使用其数字签名进行了强命名。这现在应该够安全了吧?

4

2 回答 2

3

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

基本上,您需要 pinvoke StrongNameSignatureVerificationEx,因为没有托管 API 可以满足您的需求。

另一种选择可能是调用 SignTool

于 2012-04-25T21:45:49.697 回答
1

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

你可能会反对“但我不能只是验证它是我的!”。答案是否定的,如果攻击者可以替换 EXE,那么他也可以轻松替换您的检查代码。在同一台机器上执行验证的安全性为零。

代码证书只有一个目的,它们向用户证明签名者的身份。让他们做任何其他事情是一个安全漏洞。真正糟糕的那种,那种让你觉得你的系统是安全的。并让您停止考虑实施真正的安全性。

于 2012-04-25T23:57:39.377 回答