我们有一个小型控制台应用程序(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
现在,它检查数字签名是否包含正确的主题,是否来自有效的受信任根,签名是否有效以及代码是否以其数字签名命名。这现在必须足够安全吗?
答案 0 :(得分:3)
This是一个很好的演练,包括可用于实现您想要的选项的源代码......
基本上,您需要对StrongNameSignatureVerificationEx 进行转发,因为没有托管API可以满足您的需求。
另一种选择可能是call SignTool。
答案 1 :(得分:1)
这是一个非常错误的方法。代码签名证书唯一证明的是签署EXE的个人或公司的身份。证书颁发机构仅证明身份有效。你没有证明的是它是你的证书,你只证明它是某人的证书。攻击者可以用另一个由他签名的EXE替换你的EXE。
你可能会反对“但我不能只是确认它是我的!”。答案是否定的,如果攻击者可以替换EXE那么他也可以更换你的支票代码。在同一台机器上执行验证没有任何安全性。
代码证书仅用于一个目的,它们向用户证明签名者的身份。让他们做任何其他事情都是一个安全漏洞。非常糟糕的那种,让你感觉你的系统是安全的。并且让您不再考虑实施真正的安全性。