我正在尝试创建一个自签名的RSA-2048-SHA-256证书PFX文件,以便将其用于我的WCF请求中的数据签名。
我使用了一些openSSL示例来创建证书PFX文件,但即使我将SHA算法设置为256,当我在.net应用程序中加载它时,我看到此证书的私钥具有以下设置:
[[:value1, :name1], [:value2, :name2]]
当我使用下面的代码来使用此证书时,我得到“无效算法指定的异常”,但如果我将SHA256CryptoServiceProvider更改为SHA1CryptoServiceProvider,一切正常。
KeyExchangeAlgorithm = RSA-PKCS1-KeyEx
SignatureAlgorithm = http://www.w3.org/2000/09/xmldsig#rsa-sha1
我只能假设我的证书文件不是用SHA256创建的,而是使用某种默认的SHA1算法。
这些是我用来创建证书的步骤:
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());
openssl req -x509 -days 365 -newkey rsa:2048 -sha256 -keyout key.pem -out cert.pem
我做错了什么?
答案 0 :(得分:1)
我做错了什么?
相信这两个属性有意义:)。
您看到的两个值是hard-coded into RSACryptoServiceProvider。其他RSA类型(例如RSACng)具有different, less confusing, hard-coded values。
问题是密钥没有这些属性。密钥可用于多种用途(尽管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();
}