PdfPKCS7.verify()返回false

PdfPKCS7.verify()返回false,pdf,itext,digital-signature,pkcs#7,Pdf,Itext,Digital Signature,Pkcs#7,我一直在使用itextpdf-5.5.5,完整性检查返回false PdfPKCS7 pkcs7 = fields.verifySignature(name); pkcs7.verify();<------ HERE return false PdfPKCS7 pkcs7=字段。验证签名(名称); pkcs7.verify() 嵌入在PDF中的CMS签名容器有一些可疑的属性。特别是它有一个封装的内容,即使它只是一个长度为0的字节数组。这使得iText在测试中包含该值,然后测试失败。我建

我一直在使用itextpdf-5.5.5,完整性检查返回false

PdfPKCS7 pkcs7 = fields.verifySignature(name);

pkcs7.verify();<------ HERE return false
PdfPKCS7 pkcs7=字段。验证签名(名称);

pkcs7.verify() 嵌入在PDF中的CMS签名容器有一些可疑的属性。特别是它有一个封装的内容,即使它只是一个长度为0的字节数组。这使得iText在测试中包含该值,然后测试失败。我建议创建更干净的签名容器

详细地 CMS对象类型
封装的ContentInfo
指定为:

5.2. 封装的ContentInfo类型 内容以封装的ContentInfo类型表示:

 EncapsulatedContentInfo ::= SEQUENCE {
    eContentType ContentType,
    eContent [0] EXPLICIT OCTET STRING OPTIONAL }

 ContentType ::= OBJECT IDENTIFIER
封装ContentInfo类型的字段具有以下内容 含义:

eContentType是一个对象标识符。对象标识符 唯一指定内容类型

eContent是内容本身,作为八位字节字符串携带。这个 eContent不需要进行DER编码

在 封装的ContentInfo字段使构造 “外部签名”。如果是外部签名,则 正在签名的内容不在封装的ContentInfo值中 包含在签名数据内容类型中。如果eContent值 如果不存在封装的ContentInfo,则signatureValue为 计算并将eContentType赋值为eContent 价值是存在的

()

因此,对于嵌入到PDF中的签名容器,
eContent
应该被省略,以表明该
eContent
不是经过签名的,而是单独的数据,即周围的PDF数据

OP签名文档的签名容器包含以下
封装的ContentInfo
对象:

    <30 0F>
  43   15:       SEQUENCE {
    <06 09>
  45    9:         OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
         :           (PKCS #7)
    <A0 02>
  56    2:         [0] {
    <04 00>
  58    0:           OCTET STRING
         :           }
         :         }
返回一个失败

Signature name: Signature1
Signature covers whole document: false
Subject: {SURNAME=[CHARPENTIER DIAZ], C=[CR], OU=[CIUDADANO], SN=[CPF-01-1093-0964], CN=[JOSE ALBERTO CHARPENTIER DIAZ (FIRMA)], GIVENNAME=[JOSE ALBERTO], O=[PERSONA FISICA]}
Document verifies: false
修补验证

System.out.println("Signature name: " + name);
System.out.println("Signature covers whole document: " + acroFields.signatureCoversWholeDocument(name));
PdfPKCS7 pk = acroFields.verifySignature(name);
System.out.println("Subject: " + CertificateInfo.getSubjectFields(pk.getSigningCertificate()));
System.out.println("Document verifies: " + pk.verify());
System.out.println("Signature name: " + name);
System.out.println("Signature covers whole document: " + acroFields.signatureCoversWholeDocument(name));
PdfPKCS7 pk = acroFields.verifySignature(name);
System.out.println("Subject: " + CertificateInfo.getSubjectFields(pk.getSigningCertificate()));

Field rsaDataField = PdfPKCS7.class.getDeclaredField("RSAdata");
rsaDataField.setAccessible(true);
Object rsaDataFieldContent = rsaDataField.get(pk);
if (rsaDataFieldContent != null && ((byte[])rsaDataFieldContent).length == 0)
{
    System.out.println("Found zero-length encapsulated content: ignoring");
    rsaDataField.set(pk, null);
}
System.out.println("Document verifies: " + pk.verify());
返回成功:

Signature name: Signature1
Signature covers whole document: false
Subject: {SURNAME=[CHARPENTIER DIAZ], C=[CR], OU=[CIUDADANO], SN=[CPF-01-1093-0964], CN=[JOSE ALBERTO CHARPENTIER DIAZ (FIRMA)], GIVENNAME=[JOSE ALBERTO], O=[PERSONA FISICA]}
Found zero-length encapsulated content: ignoring
Document verifies: true

(该修补程序试图保持温和,仅将零长度字节数组修补为
null

嵌入在PDF中的CMS签名容器具有一些可疑的属性。特别是它有一个封装的内容,即使它只是一个长度为0的字节数组。这使得iText在测试中包含该值,然后测试失败。我建议创建更干净的签名容器

详细地 CMS对象类型
封装的ContentInfo
指定为:

5.2. 封装的ContentInfo类型 内容以封装的ContentInfo类型表示:

 EncapsulatedContentInfo ::= SEQUENCE {
    eContentType ContentType,
    eContent [0] EXPLICIT OCTET STRING OPTIONAL }

 ContentType ::= OBJECT IDENTIFIER
封装ContentInfo类型的字段具有以下内容 含义:

eContentType是一个对象标识符。对象标识符 唯一指定内容类型

eContent是内容本身,作为八位字节字符串携带。这个 eContent不需要进行DER编码

在 封装的ContentInfo字段使构造 “外部签名”。如果是外部签名,则 正在签名的内容不在封装的ContentInfo值中 包含在签名数据内容类型中。如果eContent值 如果不存在封装的ContentInfo,则signatureValue为 计算并将eContentType赋值为eContent 价值是存在的

()

因此,对于嵌入到PDF中的签名容器,
eContent
应该被省略,以表明该
eContent
不是经过签名的,而是单独的数据,即周围的PDF数据

OP签名文档的签名容器包含以下
封装的ContentInfo
对象:

    <30 0F>
  43   15:       SEQUENCE {
    <06 09>
  45    9:         OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)
         :           (PKCS #7)
    <A0 02>
  56    2:         [0] {
    <04 00>
  58    0:           OCTET STRING
         :           }
         :         }
返回一个失败

Signature name: Signature1
Signature covers whole document: false
Subject: {SURNAME=[CHARPENTIER DIAZ], C=[CR], OU=[CIUDADANO], SN=[CPF-01-1093-0964], CN=[JOSE ALBERTO CHARPENTIER DIAZ (FIRMA)], GIVENNAME=[JOSE ALBERTO], O=[PERSONA FISICA]}
Document verifies: false
修补验证

System.out.println("Signature name: " + name);
System.out.println("Signature covers whole document: " + acroFields.signatureCoversWholeDocument(name));
PdfPKCS7 pk = acroFields.verifySignature(name);
System.out.println("Subject: " + CertificateInfo.getSubjectFields(pk.getSigningCertificate()));
System.out.println("Document verifies: " + pk.verify());
System.out.println("Signature name: " + name);
System.out.println("Signature covers whole document: " + acroFields.signatureCoversWholeDocument(name));
PdfPKCS7 pk = acroFields.verifySignature(name);
System.out.println("Subject: " + CertificateInfo.getSubjectFields(pk.getSigningCertificate()));

Field rsaDataField = PdfPKCS7.class.getDeclaredField("RSAdata");
rsaDataField.setAccessible(true);
Object rsaDataFieldContent = rsaDataField.get(pk);
if (rsaDataFieldContent != null && ((byte[])rsaDataFieldContent).length == 0)
{
    System.out.println("Found zero-length encapsulated content: ignoring");
    rsaDataField.set(pk, null);
}
System.out.println("Document verifies: " + pk.verify());
返回成功:

Signature name: Signature1
Signature covers whole document: false
Subject: {SURNAME=[CHARPENTIER DIAZ], C=[CR], OU=[CIUDADANO], SN=[CPF-01-1093-0964], CN=[JOSE ALBERTO CHARPENTIER DIAZ (FIRMA)], GIVENNAME=[JOSE ALBERTO], O=[PERSONA FISICA]}
Found zero-length encapsulated content: ignoring
Document verifies: true

(该修补程序尝试温和,仅将零长度字节数组修补为
null

感谢您的回复,我将使用您的解决方案。但我仍然遇到同样的问题。。TypeInfo-TypeInfo=typeof(PdfPKCS7).GetTypeInfo();FieldInfo rsadatfield=typeInfo.GetDeclaredField(“RSAdata”);对象rsadatfieldcontent=rsadatfield.GetValue(pkcs7);if(rsadatfieldcontent!=null&((字节[])rsadatfieldcontent).Length==0{{u log.Info(“找到零长度封装内容:忽略”);rsadatfield.SetValue(pkcs7,null);}if(pkcs7.Verify())=>Fails@Learner “我仍然有同样的问题”-该解决方案是针对PDF实施的,两年前用户3587281提供的PDF中有一个特殊问题。在当时,该解决方案是有效的。您似乎已经尝试将该解决方案移植到.Net。可能您的环境也有其他差异,可能是不同的iText版本(你不提你的),可能是一个不同的测试文件。因此,请自行将此问题作为一个问题,并提供所有必需的信息。谢谢@mkl我已在此处发布了一个问题,其中包含所有详细信息,请您查看。谢谢您的回复,我将处理您的解决方案。但我仍然有相同的问题..TypeInfo TypeInfo=typeof(PdfPKCS7).GetTypeInfo();FieldInfo-rsaDataField=typeInfo.GetDeclaredField(“RSAdata”);Object-rsadatafieldcontent=rsaDataField.GetValue(pkcs7);if(rsadatafieldcontent!=null&((字节[])rsadatafieldcontent)。长度==0){u log.Info(“找到长度为零的封装内容:忽略“;rsadatfield.SetValue(pkcs7,null);}if(pkcs7.Verify())=>Fails@Learner“我仍然有同样的问题“-该解决方案是针对PDF实施的,两年前user3587281提供的PDF中有一个特殊问题。在当时,它是有效的。您似乎