使用 openSSL 生成自签名 RSA-2048-SHA-256 证书 PFX 文件

Generate self signed RSA-2048-SHA-256 certificate PFX file using openSSL

我正在尝试创建一个自签名的 RSA-2048-SHA-256 证书 PFX 文件,以便将其用于我的 WCF 请求中的数据签名。

我使用了一些 openSSL 示例来创建证书 PFX 文件,但即使我将 SHA 算法设置为 256,当我将它加载到我的 .net 应用程序中时,我看到该证书的私钥具有这些设置:

KeyExchangeAlgorithm = RSA-PKCS1-KeyEx

SignatureAlgorithm = http://www.w3.org/2000/09/xmldsig#rsa-sha1

当我使用下面的代码来使用此证书时,我得到 "Invalid algorithm specified exception",但是如果我将 SHA256CryptoServiceProvider 更改为 SHA1CryptoServiceProvider 一切正常。

string msg = "This is my test message";

X509Certificate2 privateCert = new X509Certificate2("C:\TEMP\private.pfx", "12345");

byte[] signature = (privateCert.PrivateKey as RSACryptoServiceProvider).SignData(new UTF8Encoding().GetBytes(msg), new SHA256CryptoServiceProvider());

我只能假设我的证书文件不是用 SHA256 创建的,而是用某种默认的 SHA1 算法创建的。

这些是我用来创建证书的步骤:

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

我做错了什么?

What am I doing wrong?

相信这两个属性有意义:)。

您看到的两个值是 hard-coded into RSACryptoServiceProvider. Other RSA types (such as RSACng) have different, less confusing, hard-coded values

问题是密钥不具有这些属性中的任何一个。一个密钥可以用于多种用途(尽管 NIST 建议不要这样做)。 TLS 会话(或 EnvelopedCMS 文档等)可以具有密钥交换算法。证书、SignedCMS 文档或其他类似 material 可以具有签名(因此具有签名算法)。

要知道您的证书是使用 RSA-PKCS1-SHA256 签名的,您需要查看 X509Certificate2.SignatureAlgorithm

switch (cert.SignatureAlgorithm.Value)
{
    case "1.2.840.113549.1.1.4":
        return "RSA-PKCS1-MD5";
    case "1.2.840.113549.1.1.5";
        return "RSA-PKCS1-SHA1";
    case "1.2.840.113549.1.1.11";
        return "RSA-PKCS1-SHA2-256"; // Winner
    case "1.2.840.113549.1.1.12":
        return "RSA-PKCS1-SHA2-384";
    case "1.2.840.113549.1.1.13":
        return "RSA-PKCS1-SHA2-512";
    default:
        throw new SomethingFromTheFutureOrMaybeNotRSAException();
}