我有一个经过数字签名的二进制app.exe。证书由商业CA颁发。在文件属性中(在Windows上),数字签名信息表明此数字签名正常。如果我以某种方式修改二进制文件(例如,通过更改资源黑客中的资源),数字签名信息表明此数字签名无效。
我尝试以编程方式验证证书,但无论我使用哪个文件 - 原始(app.exe)或篡改的(app-modified.exe),X509Certificate2.Verify()都会返回true
。
string filename = "app.exe"; // "app-modified.exe"
X509Certificate cert1 = X509Certificate.CreateFromSignedFile(filename);
X509Certificate2 cert2 = new X509Certificate2(cert1);
bool isValid = cert2.Verify();
为什么在这两种情况下此函数都返回true?这是验证文件数字签名的正确方法吗?
答案 0 :(得分:1)
我认为您误解了数字签名验证流程。粗略验证数字签名过程包括两个步骤,第一步是验证签名完整性(检查签名应用后是否有人修改文档),第二步是验证证书状态(检查证书是否有效,未过期或撤销)。
因此,如果您修改已签名的app.exe,则会破坏您的签名,但如果证书有效则保持有效,这就是两种情况下证书验证都正常的原因。
如果不是仅验证您验证签名的证书,那么app-modified.exe中的结果将为false,因为当您修改app.exe时,您打破了签名。
希望这有帮助,