ContentInfo content = new ContentInfo(new Oid("1.2.840.113549.1.7.5"), Encoding.UTF8.GetBytes(str.ToString()));
SignedCms signedCms = new SignedCms(content, true);
CmsSigner cmsSigner = new CmsSigner(cert);
cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;
cmsSigner.DigestAlgorithm = new Oid("2.16.840.1.101.3.4.2.1");
cmsSigner.SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber;
Pkcs9AttributeObject att = new Pkcs9AttributeObject();
AsnEncodedData data = new AsnEncodedData(new SHA1Managed().ComputeHash(cert.RawData));
cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.UtcNow));
//cmsSigner.SignedAttributes.Add(new Pkcs9ContentType());
//cmsSigner.SignedAttributes.Add(new Pkcs9MessageDigest());
signedCms.ComputeSignature(cmsSigner);
return Convert.ToBase64String(signedCms.Encode());
我已经使用此代码来签署文档,并且此代码工作正常,但我的问题是还需要添加“SigningCertificateV2”属性作为签名属性...
我已经添加了 ContentType、MessageDigest 和 SigningTime。但我不知道如何添加“SigningCertificateV2”属性..(1.2.840.113549.1.9.16.2.47)
你能帮我解决这个问题吗?
最佳答案
(这个问题似乎已经有一年半多没有得到解答了,所以我真的希望 Asharf 能够以某种方式遵守新的要求。不过已经有超过 300 次浏览,所以希望能迟到得到答案仍然会有帮助。)
System.Security.Cryptography.Pkcs
中的类型不提供对各种加密消息语法 (CMS) 规范(如 CMS Advanced Electronic Signatures (CAdES) )定义的全部属性的支持和 Enhanced Security Services Update (ESSCertIdUpdate) ,但仅适用于最常用的属性,例如 Pkcs9ContentType
、Pkcs9MessageDigest
、Pkcs9SigningTime
等。
具体来说,SigningCertificatev2
属性周围没有由 ESSCertIdUpdate ( RFC 5035 ) 定义的“强类型”包装器。在这种情况下,必须使用“通用”CryptographicAttributeObject
类型并“手动”构造属性的 ASN.1 编码数据,即,通常使用以下方法构建原始 byte[] System.Formats.Asn1.AsnWriter
(并彻底阅读相关的 RFC——顺便说一句,这总是一个好主意)。
为 SigningCertificatev2 属性定义包装器需要大量代码,因为还需要定义其他几个相关的 RFC 类型,例如 ESSCertIDv2
和 PolicyInformation
。
幸运的是,有一个著名的开源软件项目已经做到了这一点——它可以用于“灵感”;-)。这就是 NuGet,特别是 NuGet client .
(我知道仅链接的答案是不受欢迎的,但我想一个主要是链接的答案比没有答案好,所以这里......)。
以下是 GutHub 存储库中相关部分的链接。
- CreateSigningCertificateV2()在
AttributeUtility
- SigningCertificateV2自行输入。
- EssCertIdV2类型,由 SigningCertificateV2 使用。
NuGet 客户端的属性实现不能直接用作库,但它应该提供有关如何构造 PKCS 属性的良好指南。
关于c# - 将signingCertificateV2属性添加到SignedCms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65914439/