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

亚历克斯

我试图创建一个自签名的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

我究竟做错了什么?

巴顿

我究竟做错了什么?

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

您看到的两个值被硬编码到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();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章