【问题标题】:Signing with CMS and RSACng in .NET Core在 .NET Core 中使用 CMS 和 RSACng 进行签名
【发布时间】:2020-10-06 09:02:42
【问题描述】:

似乎 CNG 取代了 .NET Core 中的 CSP 如here所述:

此方法仅在 .NET Framework 上受支持。它在 .NET Core 上的使用 抛出 PlatformNotSupportedException。

但 CmsSigner 并没有公开任何 API 来支持 CNG 密钥,例如,没有像 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();

【问题讨论】:

  • 显然您需要一个签名者证书,而不仅仅是一个私钥。可以通过X509Certificate2 对象提供证书及其私钥。
  • 我编辑了这个问题来说明我为什么需要这个

标签: c# .net-core cryptography cng


【解决方案1】:

对于 .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);
       ...
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多