【发布时间】:2021-01-18 04:26:50
【问题描述】:
我正在尝试使用 CmsSigner 签署消息并附加 X509 证书:
public static byte[] Sign(X509Certificate2 certificate, string keyXml)
{
ContentInfo contentInfo = new ContentInfo(new Oid("1.2.840.113549.1.7.1"), Encoding.ASCII.GetBytes("hello"));
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(keyXml);
using (certificate.GetRSAPrivateKey())
{
certificate.PrivateKey = rsa;
}
var signer = new CmsSigner(certificate);
signer.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");
signer.SignedAttributes.Add(new Pkcs9SigningTime());
var signedCms = new SignedCms(contentInfo, false);
signedCms.ComputeSignature(signer);
var encodeByteBlock = signedCms.Encode();
return encodeByteBlock;
}
证书没有密钥(HasPrivateKey 是 false)所以我使用使用 OpenSSL 生成的正确密钥设置它:
openssl req -new -sha256 -x509 -days 7300 -out ca.crt -keyout ca.key.pem -nodes
我将 ca.key.pem 转换为 XML。
但是当ComputeSignature被调用时,抛出了这个异常:
System.Security.Cryptography.CryptographicException: '密钥集没有 存在'
堆栈跟踪:
在 System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo(CmsSigner 签名者,布尔静默,SafeCryptProvHandle& hProv)在 System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner 签名者, 布尔无声)在 System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner 签名者,布尔无声)在 System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner 签名者)在 ConsoleTest472.Program.Sign(X509Certificate2 证书,字符串 keyXml) 在 D:\me\Projects\ConsoleTest472\ConsoleTest472\Program.cs:第 56 行 ConsoleTest472.Program.Main(String[] args) 在 D:\me\Projects\ConsoleTest472\ConsoleTest472\Program.cs:第 63 行
我使用的代码有什么问题? keyset 不是在私钥设置的时候设置的吗?
【问题讨论】:
标签: c# cryptography certificate rsa x509certificate