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

5
我正在尝试创建一个自签名的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

当我使用下面的代码来使用该证书时,我会收到“指定的算法无效异常”的错误提示,但如果我将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

我做错了什么?


1
至于为什么您无法使用该密钥创建新的基于SHA-256的签名,可以在pkcs12命令中添加“-CSP”Microsoft Enhanced RSA和AES加密提供程序”,或从cert.GetRSAPrivateKey()获取私钥。但这实际上是一个不同的问题。 - bartonjs
感谢您的评论,我在我的pkcs12命令中使用了“Microsoft Enhanced RSA and AES Cryptographic Provider(CSP)”,现在它可以工作了。实际上,我之前尝试过这种方法,但由于某些原因,pkcs12命令失败了。我还尝试使用cert.GetRSAPrivateKey(),这也起作用了,尽管它需要.NET Framework 4.6。 - Alex
1个回答

1

我做错了什么?

相信那两个属性有意义 :).

你看到的这两个值是 硬编码进 RSACryptoServiceProvider 中的。其他 RSA 类型(如 RSACng)有不同、不那么混淆、硬编码的值

问题是一个密钥没有这些属性。一个密钥可以用于多个目的(尽管 NIST 不建议这样做)。一个 TLS 会话(或 EnvelopedCMS 文档等)可以拥有密钥交换算法。证书、SignedCMS 文档或其他这样的材料可以有签名(因此有签名算法)。

要知道您的证书是使用 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();
}

谢谢你的回答,我使用cert.SignatureAlgorithm值检查了我的证书,正如你所说,它实际上是RSA-PKCS1-SHA2-256 :)。 - Alex

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