仅使用公钥验证签名

问题描述 投票:1回答:1

我有两个申请。一个签署文件,另一个验证。

签名应用程序执行以下操作:

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或其他函数来验证签名?

c# ssl rsa digital-signature public-key
1个回答
1
投票

我已经有了.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);
}
© www.soinside.com 2019 - 2024. All rights reserved.