微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在.NET Core中使用CMS和RSACng签名

如何解决在.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();

但它在ComputeSignature调用中引发了此异常:

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 举报,一经查实,本站将立刻删除。