如何用C#验证经自签名证书签名的.exe文件为我方签署
使用C#验证EXE文件的自签名证书有效性
前置条件
因为你用的是自签名证书,客户机器必须信任你的证书:
- 将你生成的自签名证书导出为
.cer格式(不包含私钥) - 在客户机器上,把这个
.cer文件导入到本地计算机 -> 受信任根证书颁发机构存储区
C#验证代码实现
可以借助System.Security.Cryptography.X509Certificates命名空间下的API完成验证,核心是两步:验证签名的有效性+确认证书是我方的。
完整示例代码
using System; using System.Security.Cryptography.X509Certificates; public static class SignatureVerifier { // 替换为你的自签名证书的指纹(可在证书属性中查看) private const string OurCertThumbprint = "你的证书指纹(大写,去掉空格)"; public static bool IsOurSignedExe(string exePath) { try { // 获取文件的签名证书 var cert = X509Certificate2.CreateFromSignedFile(exePath); // 验证证书信任链(确保客户机器信任该证书) using var chain = new X509Chain(); chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // 自签名证书可关闭吊销检查,正式场景按需调整 bool isChainValid = chain.Build(cert); if (!isChainValid) { // 可输出链错误信息排查 foreach (var status in chain.ChainStatus) { Console.WriteLine($"链验证错误:{status.StatusInformation}"); } return false; } // 验证证书是否为我方的:对比指纹(最精准) string certThumbprint = cert.Thumbprint?.Trim().ToUpperInvariant(); return string.Equals(certThumbprint, OurCertThumbprint, StringComparison.OrdinalIgnoreCase); } catch (Exception ex) { // 捕获文件未签名、文件不存在等异常 Console.WriteLine($"验证失败:{ex.Message}"); return false; } } }
代码说明
- 证书指纹验证:证书的指纹是唯一标识,替换代码中的
OurCertThumbprint为你证书的实际指纹(在证书属性的“详细信息”标签中找到“指纹”,复制时去掉中间的空格)。 - 信任链验证:
X509Chain.Build()会检查证书是否在客户机器的信任存储中,确保签名没有被篡改。 - 异常处理:捕获文件未签名、文件不存在、证书无效等情况,避免程序崩溃。
额外注意事项
- 如果客户机器没有导入你的根证书,
X509Chain.Build()会返回false,验证失败。 - 正式环境中,可以根据需求开启吊销检查(调整
RevocationMode为X509RevocationMode.Online或Offline)。
内容的提问来源于stack exchange,提问作者Smith5727
相关产品推荐
相关产品推荐

