我们有一个小型控制台应用程序(小于 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
现在,它检查数字签名是否包含正确的主题、来自有效的受信任根、签名是否有效以及代码是否使用其数字签名进行了强命名。这现在应该够安全了吧?