Java 将PDF吊销信息添加为已签名属性pdfReservision InfoArchive OID 1.2.840.113583.1.1.8

Java 将PDF吊销信息添加为已签名属性pdfReservision InfoArchive OID 1.2.840.113583.1.1.8,java,pdf,cryptography,signing,Java,Pdf,Cryptography,Signing,在生成签名时,我们添加了PDFREOID(1.2.840.113583.1.1.8)作为签名属性。在构建此属性时,我们使用了外部CRL文件(ca CRL.CRL),并将OID 1.2.840.113583.1.1.8构建为ASN1对象。在签署pdf和时间戳签名后,一切正常。但我们无法理解PDF中添加的标识符(adbe RevocationFoArchive)是否正确,该标识符可用于通过获取此OID来验证此PDF。此外,我们无法检查该属性的格式是否正确,PDF是否可以验证该属性。是否有任何工具或实

在生成签名时,我们添加了PDFREOID(1.2.840.113583.1.1.8)作为签名属性。在构建此属性时,我们使用了外部CRL文件(ca CRL.CRL),并将OID 1.2.840.113583.1.1.8构建为ASN1对象。在签署pdf和时间戳签名后,一切正常。但我们无法理解PDF中添加的标识符(adbe RevocationFoArchive)是否正确,该标识符可用于通过获取此OID来验证此PDF。此外,我们无法检查该属性的格式是否正确,PDF是否可以验证该属性。是否有任何工具或实用程序可用于检查作为已签名属性插入的此属性是否有效

如果有任何PDF工具/实用程序可用于可视化属性,请在PDF中共享

我们已在位置[0]处生成发行人CRL信息在该OID中添加CRL是否正确?我已经分享了下面的代码片段

以下对象标识符标识Adobe的吊销信息属性:

adbe-revocationInfoArchival OBJECT IDENTIFIER ::=
        { adbe(1.2.840.113583) acrobat(1) security(1) 8 }
Adobe的吊销信息属性值具有ASN.1类型RevocationInfo存档:

    /**
     ** RevocationInfoArchival ::= SEQUENCE {
     **   crl [0] EXPLICIT SEQUENCE of CRLs, OPTIONAL
     **   ocsp [1] EXPLICIT SEQUENCE of OCSP Responses, OPTIONAL
     **   otherRevInfo [2] EXPLICIT SEQUENCE of OtherRevInfo, OPTIONAL
      }
    */
Adobe在Java Bouncy Castle API中使用的吊销信息属性值构建:

private ASN1EncodableVector genPdfInfoArchival(ASN1EncodableVector v) {
        
        ASN1EncodableVector v1 = new ASN1EncodableVector();
        
        List<X509CRL> crls = new ArrayList<X509CRL>();
        ASN1InputStream t = null;
        try {
            
            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
            CRL crl = certFactory.generateCRL(new FileInputStream(new File("e://app//esp//crl//NSDLe-GovCA2019-Test-2.crl")));
            System.out.println("crl:" + crl);
            crls.add((X509CRL)crl);
            
            if (!crls.isEmpty()) {
                ASN1EncodableVector v11 = new ASN1EncodableVector();
                for (Iterator<X509CRL> i = crls.iterator(); i.hasNext();) {
                    t = new ASN1InputStream(new ByteArrayInputStream(i.next().getEncoded()));
                    v11.add(t.readObject());
                }
                //0 for CRL
                v1.add(new DERTaggedObject(true, 0, new DERSequence(v11)));
            }
} 
        
        return v1;}
专用ASN1EncodaLevector GenpdFinfoArchive(ASN1EncodaLevector v){
ASN1EncodableVector v1=新的ASN1EncodableVector();
List crls=new ArrayList();
ASN1InputStream t=null;
试一试{
CertificateFactory=CertificateFactory.getInstance(“X.509”);
CRL CRL=certFactory.generateCRL(新文件输入流(新文件(“e://app//esp//CRL//NSDLe-GovCA2019-Test-2.CRL”));
System.out.println(“crl:+crl”);
添加((X509CRL)crl);
如果(!crls.isEmpty()){
ASN1EncodableVector v11=新的ASN1EncodableVector();
for(迭代器i=crls.Iterator();i.hasNext();){
t=新的ASN1InputStream(新的ByteArrayInputStream(i.next().getEncoded());
v11.add(t.readObject());
}
//0表示CRL
添加(新的DERTaggedObject(true,0,新的DERSequence(v11));
}
} 
返回v1;}
构建OID后,将其作为签名属性添加到SignerInforGeneratorBuilder中,并生成签名,然后在PDF中添加此签名

cmssignedatagenerator=new cmssignedatagenerator();
ASN1EncodableVector signedAttr=新的ASN1EncodableVector();
字符串ID_ADBE_REVOCATION=“1.2.840.113583.1.1.8”;
//待办事项添加sgning的消息摘要-Nikhill
Attribute attr=new属性(CMSAttributes.messageDigest,newderset(newderoctetstring(IOUtils.toByteArray(hashdata)));
签名地址添加(属性);
//TODO生成pdf信息存档并将其添加为CMS签名属性-Nikhill
ASN1EncodableVector pdfInfo=genpdfinfoarchive(signedAttr);
属性ar=新属性(新ASN1ObjectIdentifier(ID_ADBE_REVOCATION)、新DERSet(新DERSequence(pdfInfo));
已签名的交易记录添加(ar);
List certList=new ArrayList();
certList.addAll(array.asList(certificateChain));
存储证书=新JcaCertStore(证书列表);
DefaultSignedAttributeTableGenerator sa=新的DefaultSignedAttributeTableGenerator(新的AttributeTable(signedAttr));
SignerInfoGeneratorBuilder=new SignerInfoGeneratorBuilder(new BcDigestCalculatorProvider());
生成器。设置已签名的属性生成器(sa);
请在下面找到包含示例签名pdf文件的google drive链接hello_signed_ts_pdfarchivalinfo.pdf


任何帮助都将不胜感激。

我已经使用下面的java源代码检查了pdf中添加的属性。还有一个iText Java实用程序,它可以调试pdf对象树,或者从我的google驱动器链接下载它,使用
Java-jar jar name
运行它,它可能会帮助调试pdf对象

Pdf存档信息检索源代码返回位置[0]处的CRL流对象

private void getPdfRevoInfoArch(SignerInformation signerInform) {
        
        AttributeTable at = signerInform.getSignedAttributes();
        
        ASN1Encodable arch =    at.get(new ASN1ObjectIdentifier("1.2.840.113583.1.1.8")).getAttrValues().getObjectAt(0);
        
        //ASN1Encodable arch1 = at.get(new ASN1ObjectIdentifier("1.2.840.113583.1.1.8")).getAttrValues().getObjectAt(1);
                
        System.out.println("arc:" + arch);
        System.out.println("archSize:" + at.get(new ASN1ObjectIdentifier("1.2.840.113583.1.1.8")).getAttrValues().size());
        
    }
private void getPdfRevoInfoArch(SignerInformation signerInform) {
        
        AttributeTable at = signerInform.getSignedAttributes();
        
        ASN1Encodable arch =    at.get(new ASN1ObjectIdentifier("1.2.840.113583.1.1.8")).getAttrValues().getObjectAt(0);
        
        //ASN1Encodable arch1 = at.get(new ASN1ObjectIdentifier("1.2.840.113583.1.1.8")).getAttrValues().getObjectAt(1);
                
        System.out.println("arc:" + arch);
        System.out.println("archSize:" + at.get(new ASN1ObjectIdentifier("1.2.840.113583.1.1.8")).getAttrValues().size());
        
    }