c# - 将signingCertificateV2属性添加到SignedCms

标签 c# cryptography certificate signature digital

    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) ,但仅适用于最常用的属性,例如 Pkcs9ContentTypePkcs9MessageDigestPkcs9SigningTime 等。

具体来说,SigningCertificatev2 属性周围没有由 ESSCertIdUpdate ( RFC 5035 ) 定义的“强类型”包装器。在这种情况下,必须使用“通用”CryptographicAttributeObject 类型并“手动”构造属性的 ASN.1 编码数据,即,通常使用以下方法构建原始 byte[] System.Formats.Asn1.AsnWriter(并彻底阅读相关的 RFC——顺便说一句,这总是一个好主意)。

为 SigningCertificatev2 属性定义包装器需要大量代码,因为还需要定义其他几个相关的 RFC 类型,例如 ESSCertIDv2PolicyInformation

幸运的是,有一个著名的开源软件项目已经做到了这一点——它可以用于“灵感”;-)。这就是 NuGet,特别是 NuGet client .

(我知道仅链接的答案是不受欢迎的,但我想一个主要是链接的答案比没有答案好,所以这里......)。

以下是 GutHub 存储库中相关部分的链接。

NuGet 客户端的属性实现不能直接用作库,但它应该提供有关如何构造 PKCS 属性的良好指南。

关于c# - 将signingCertificateV2属性添加到SignedCms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65914439/

相关文章:

perl - Filter::Crypto 模块对 DATA 部分做了什么?

python - 重新排列字符串/列表的所有方法的列表

android - 在Android 4.1.2(Jelly Bean)上安装数字证书

windows - Windows 证书存储的 Linux 等效项

c# - 在 .NET 中验证时 '/' 中的服务器错误

c# - 如何将接口(interface)对象列表发布到 ASP.NET WebApi Action 中?

java - 从 HTTP POST 计算 HMAC 而无需将整个请求主体复制到内存中

c# - 'CalendarExtender1' 的 TargetControlID 无效。找不到 ID 为 'text1' 的控件

c# - 将用户生成的查询向下传递到 n 层应用程序

c# - 什么是 pfxblob