C# 如何在没有完整X509证书的情况下使用PdfPkcs7?

C# 如何在没有完整X509证书的情况下使用PdfPkcs7?,c#,.net-core,itext7,pkcs#7,C#,.net Core,Itext7,Pkcs#7,我们正在尝试通过移动签名服务对PDF进行外部签名。Stackoverflow中有很多关于这个主题的问题,特别是来自土耳其的问题。请参阅:。这里也一样 我们要求MSSP提供个人资料信息。由于有关个人数据保护的法律,我们无法检索签名者的完整公共证书或链 配置文件查询服务的响应: http://uri.turkcellteknoloji.com.tr/MobileSignature/profile2 C=TR,O=Elektronik Bilgi Guvenligi A.S.,CN=Turkcell

我们正在尝试通过移动签名服务对PDF进行外部签名。Stackoverflow中有很多关于这个主题的问题,特别是来自土耳其的问题。请参阅:。这里也一样

我们要求MSSP提供个人资料信息。由于有关个人数据保护的法律,我们无法检索签名者的完整公共证书或链

配置文件查询服务的响应:


http://uri.turkcellteknoloji.com.tr/MobileSignature/profile2
C=TR,O=Elektronik Bilgi Guvenligi A.S.,CN=Turkcell Mobil NES Hizmet Saglayicisi S2
313460597714010174158784514408553193353
MVI4FeeToX6TDPLh3h9zEw19ulzTomxPB/zDvnyWzKA=
http://localhost
MGOxCzaJBGNVBaytalrsMsgwjyDvqkdb9fBgVrdHjVmblRieJPBGdPied1DMVubgLnasBBllmumtewyWydVqdChudxJry2VSBCbNb2JPBCborVMGSGL6BwV0IFNHZ2xHewljaxNPIfMy
请求(好)
我们仍然能够使用此信息创建SigningCertificateV2实例

var certAlgorithmIdentifier=新算法标识符(certHashDigestAlgorithm);
var certHash=Convert.FromBase64String(certHashDigestValue);
var issuer=新的通用名称(新的通用名称(新的X509Name(certIssuerDN));
var serial=新的DerInteger(新的BigInteger(certSerialNumber));
var issuerSerial=新发行人序列(发行人,序列号);
var certIDv2=新的ESSCertitdv2(certAlgorithmIdentifier、certHash、issuerSerial);
返回新的签名证书EV2(certIDv2);
ASN.1的结果是:

SEQUENCE (1 elem)
  SEQUENCE (1 elem)
    SEQUENCE (3 elem)
      SEQUENCE (1 elem)
        OBJECT IDENTIFIER 1.2.840.113549.1.1.11 sha256WithRSAEncryption (PKCS #1)
      OCTET STRING (32 byte) 31523815E793A17E930CF2E1DE1F73130D7DBA5CD3A26C4F07FCC3BE7C96CCA0
      SEQUENCE (2 elem)
        SEQUENCE (1 elem)
          [4] (1 elem)
            SEQUENCE (3 elem)
              SET (1 elem)
                SEQUENCE (2 elem)
                  OBJECT IDENTIFIER 2.5.4.6 countryName (X.520 DN component)
                  PrintableString TR
              SET (1 elem)
                SEQUENCE (2 elem)
                  OBJECT IDENTIFIER 2.5.4.10 organizationName (X.520 DN component)
                  UTF8String Elektronik Bilgi Guvenligi A.S.
              SET (1 elem)
                SEQUENCE (2 elem)
                  OBJECT IDENTIFIER 2.5.4.3 commonName (X.520 DN component)
                  UTF8String Turkcell Mobil NES Hizmet Saglayicisi S2
        INTEGER (128 bit) 313460597714010174158784514408553193353
我们还可以从CA的密钥链中检索根证书和中间证书

那么,我们如何将它们与PdfSigner和PdfPKCS7结合使用来签署PDF?我们是否应该在外部创建CMSSignedData,以及如何创建?这个路线图正确吗

  • 从ByteRange的PDF内容计算摘要
  • 从外部创建Cms容器。(不知怎的)
  • 添加签名者信息,并将内容摘要放入容器中
  • 从CMS认证属性计算摘要
  • 通过MSSP签署最终摘要,并检索XMLDSig
  • 将签名字段添加到现有Cms容器中
  • 使用DER编码的CmsSignedData在PDF签名字典中填充/内容
  • 我知道关于同一个话题有很多问题。但它们都不够清楚,无法解释处理签名证书的过程

    编辑: 为了澄清,我们将在发送SHA-256摘要(base64编码)时,在签名请求之后检索X509证书

    XML签名,从签名服务返回:

    
    ...
    ...
    ...
    ...
    
    但正如我前面提到的,我们不能在签名请求之前检索签名者的完整公共证书。仅证书哈希、序列号和颁发者DN。此信息足以在签名请求之前设置
    ESS signing-certificate-v2
    属性

    这就是为什么我们应该能够在本地创建CmsSignedData,并添加pdf内容摘要、签名者信息(从概要文件查询中检索到signing-certificate-v2),并从该CmsSignedData实例获取最终摘要,以便使用MSSP签名服务进行签名。之后,当我们从服务中检索XML签名时,我们可以填充此CmsSignedData实例中的其他未签名属性和证书。

    回答问题的第一个版本,该问题给人的印象是,完整签名者证书根本不可用,甚至在签名服务中也不可用回答:

    如果不嵌入签名者的X509证书,则无法创建pdf签名

    至少不是以互操作的方式

    根据pdf规范:

    12.8.3.2 PKCS#1签名 […]对于使用PKCS#1签名PDF文件,应使用的子筛选器的唯一值是adbe.x509.rsa#sha1。 […]签名人的证书链应存储在证书条目中

    12.8.3.3 CMS(PKCS#7)签名 […]副过滤器应采用以下值之一:

    • adbe.pkcs7.detached[…]
    • adbe.pkcs7.sha1[…]
    CMS对象至少应包括签名人的X.509签名证书。本证书用于验证内容中的签名值

    (ISO 32000-2,第12.8.3节签名互操作性)

    如果您正在查看PAdES签名,根据PAdES规范:

    6.3帕德斯基线签名 [……]

    其他要求:

    a) 生成器应在SignedData.certificates字段中包含签名证书

    (ETSI EN 319 142-1 V1.1.1)


    因此,如果没有签名者的X509证书,您就无法创建可互操作的pdf签名。

    那么,作为子过滤器的
    ETSI.CAdES.detached
    呢。正如我所知,在这种情况下,证书输入是被禁止的。“那么,ETSI.CAdES.detached作为子过滤器呢。”-这些是PAdES签名。因此,请参见最后一段引文。“据我所知,在这种情况下,证书输入是被禁止的。”-是的。明显地“顺便说一下,我已经编辑了这个问题”-这个编辑确实完全改变了这个问题。那个编辑确实完全改变了这个问题-我的错误,对不起。好吧,我能考虑你的答案吗?因为它不再是不可能的。(至少我这么认为,我还没有详细检查您的XML。)