如何解决在.NET Core中使用CMS和RSACng签名
CNG似乎在.NET Core中取代了CSP 如here所述:
.NET Framework仅支持此方法。在.NET Core上的使用 抛出PlatformNotSupportedException。
但是CmsSigner不会公开任何支持CNG密钥的API,例如,没有CngParameters
这样的东西来指定用于签名的CNG密钥。
当我在.NET Framework中使用CmsSigner(CspParameters)
时,它将创建一个用于签名的虚拟证书。
我尝试这样做只是为了看看会发生什么:
var signer = new CmsSigner();
signer.PrivateKey = new RSACng(CngKey.Open("rsaKey"));
signer.SignedAttributes.Add(new Pkcs9SigningTime());
var signedCms = new SignedCms(new ContentInfo(new byte[] { 1,2,3 }),false);
signedCms.ComputeSignature(signer);
var encodeByteBlock = signedCms.Encode();
system.invalidOperationException:'没有签署者证书 提供。”
在.NET Framework中,我可以这样做:
var cspObj = new CspParameters()
{
ProviderName = "provider",ProviderType = 1,KeyNumber = (int)KeyNumber.Signature,Flags = CspProviderFlags.UseExistingKey,KeyContainerName = "ContainerName"
};
var signer = new CmsSigner(cspObj)
{
DigestAlgorithm = new Oid(_signerHashAlgorithmOid)
};
signer.SignedAttributes.Add(new Pkcs9SigningTime());
var signedCms = new SignedCms(contentInfo,true);
signedCms.ComputeSignature(signer);
var encodeByteBlock = signedCms.Encode();
解决方法
对于.NET Core实现,您需要提供带有绑定私钥的证书。如果证书对您的目的并不重要,则可以创建自己的虚拟证书。此示例使用RSA-SHA256,而.NET Framework中的CspParameters版本使用RSA-SHA1,但在其他方面基本上相同。
using (CngKey cngKey = CngKey.Open(...))
using (RSA rsa = new RSACng(cngKey))
{
CertificateRequest req = new CertificateRequest(
"CN=CMS Signer Dummy Certificate",rsa,HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1);
DateTimeOffset now = DateTimeOffset.UtcNow;
using (X509Certificate2 cert = req.CreateSelfSigned(now,now.AddYears(1)))
{
CmsSigner signer = new CmsSigner(cert);
...
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。