我正在尝试创建一个自签名 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 算法创建的。
这些是我用来创建证书的步骤:
openssl req -x509 -days 365 -newkey rsa:2048 -sha256 -keyout key.pem -out cert.pem
openssl pkcs12 -export -in cert.pem -inkey key.pem -out private.pfx
我究竟做错了什么?
我究竟做错了什么?
相信这两个属性有意义:)。
您看到的两个值是硬编码到 RSACryptoServiceProvider 中 https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,ade983854eda2cc5。其他 RSA 类型(例如 RSACng)具有不同的、不易混淆的、硬编码的值 https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsa.cs,3cbb52d748deed2b.
问题是密钥不具有这些属性中的任何一个。一个密钥可以用于多种目的(尽管 NIST 建议不要这样做)。 TLS 会话(或 EnvelopedCMS 文档等)可以具有密钥交换算法。证书、SignedCMS 文档或其他此类材料可以具有签名(以及签名算法)。
要知道您的证书是使用 RSA-PKCS1-SHA256 签名的,您需要查看X509证书2.签名算法 https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.signaturealgorithm(v=vs.110).aspx.
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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)