【发布时间】: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