使用公钥验证签名(C#)

4
我有两个应用程序。一个用于签署文件,另一个用于验证。
签署应用程序执行以下操作:
X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "cert.pfx", "password");

using (RSA rsa = certificate.GetRSAPrivateKey())
{
    signature = rsa.SignData(exeContent, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

"cert.pfx" 是使用 OpenSSL 生成的自签名证书。
验证应用程序:
X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "cert.pfx", "password");

using (RSA rsa = certificate.GetRSAPublicKey())
{
    return rsa.VerifyData(exeContentWithoutSignature, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

据我所知,.pfx文件包含公钥和私钥信息,因此我不应该将其提供给任何人。我知道,在验证步骤中只需要公钥。如何在不暴露我的.pfx文件的情况下使用rsa.VerifyData或其他函数来验证签名呢?

1
你需要将它们分别保存在两个文件中,并且只公开公钥文件。 - spodger
1
https://blog.lextudio.com/simple-public-private-key-signing-sample-code-6f95d19fdbc - Lex Li
@LexLi 谢谢您提供的链接 :) - Chris
1个回答

4

我已经有了可以通过以下方式生成的.pfx文件:

openssl req -x509 -days 365 -newkey rsa:2048 -keyout test-key.pem -out test-cert.pem
openssl pkcs12 -export -in test-cert.pem -inkey test-key.pem -out test-cert.pfx

为了提取仅包含公钥的证书,可以使用以下命令:
openssl pkcs12 -in test-cert.pfx -clcerts -nokeys -out cert.pem

-clcerts - 仅输出客户端证书。
-nokeys - 不要输出私钥。

Cert.pem 可用于创建 X509Certificate2 实例:

X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "test-cert.pem");

using (RSA rsa = certificate.GetRSAPublicKey())
{
    return rsa.VerifyData(exeContentWithoutSignature, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接