C# X509Certificate2.验证行为

C# X509Certificate2.验证行为,c#,x509certificate,digital-signature,x509certificate2,C#,X509certificate,Digital Signature,X509certificate2,我有一个数字签名的二进制app.exe。证书由商业CA颁发。在文件属性(在Windows上)中,数字签名信息表明此数字签名没有问题。如果我以某种方式修改二进制文件(例如,通过在Resource Hacker中更改资源),则数字签名信息表示此数字签名无效 我试图以编程方式验证证书,但无论我使用的是原始文件(app.exe)还是篡改文件(app modified.exe),都会返回true 为什么此函数在这两种情况下都返回true?这是验证文件数字签名的正确方法吗?我认为您误解了数字签名验证过程。大

我有一个数字签名的二进制app.exe。证书由商业CA颁发。在文件属性(在Windows上)中,数字签名信息表明此数字签名没有问题。如果我以某种方式修改二进制文件(例如,通过在Resource Hacker中更改资源),则数字签名信息表示此数字签名无效

我试图以编程方式验证证书,但无论我使用的是原始文件(app.exe)还是篡改文件(app modified.exe),都会返回
true


为什么此函数在这两种情况下都返回true?这是验证文件数字签名的正确方法吗?

我认为您误解了数字签名验证过程。大致验证数字签名过程包括两个步骤,第一步是验证签名完整性(检查签名应用后没有人修改文档),第二步是验证证书状态(检查证书是否有效、未过期或吊销)

因此,如果修改已签名的app.exe,您的签名将被破坏,但如果证书有效,它将保持有效,这就是在这两种情况下,您的证书验证都正常的原因

如果您不只是验证证书,而是验证签名,则app-modified.exe中的结果将为false,因为当您修改app.exe时,您破坏了签名

希望这有帮助

string filename = "app.exe"; // "app-modified.exe"
X509Certificate cert1 = X509Certificate.CreateFromSignedFile(filename);
X509Certificate2 cert2 = new X509Certificate2(cert1);
bool isValid = cert2.Verify();