首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将PDF撤销信息添加为签名属性pdfRevocationInfoArchival OID 1.2.840.113583.1.1.8

将PDF撤销信息添加为签名属性pdfRevocationInfoArchival OID 1.2.840.113583.1.1.8
EN

Stack Overflow用户
提问于 2020-07-30 08:44:17
回答 1查看 517关注 0票数 3

我们在生成签名时添加了pdfRevocationInfoArchival OID (1.2.840.113583.1.1.8)作为签名属性。在构建该属性时,我们使用外部CRL文件(ca-crl.crl),并将OID 1.2.840.113583.1.1.8作为ASN1对象。在签署pdf和时间戳签名后,一切都很好。但是我们无法理解在PDF中添加的标识符()是正确的,可以通过获取这个OID来验证这个PDF。此外,我们无法检查此属性是否采用PDF可以验证的适当格式。是否有任何工具或实用工具可用于检查作为签名属性插入的属性是否有效。 如果任何PDF工具/实用工具可用可视化属性,请共享PDF。我们已经建立了发行人的CRL信息在位置,这是正确的方式添加CRL在这个OID?我分享了下面的代码片段

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

代码语言:javascript
运行
复制
adbe-revocationInfoArchival OBJECT IDENTIFIER ::=
        { adbe(1.2.840.113583) acrobat(1) security(1) 8 }

Adobe的吊销信息属性值具有ASN.1类型的RevocationInfoArchival:

代码语言:javascript
运行
复制
    /**
     ** 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中:

代码语言:javascript
运行
复制
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;}

在构建OID之后,将它作为一个已签名的属性添加到SignerInforGeneratorBuilder中,然后生成签名,然后在PDF中添加这个签名

代码语言:javascript
运行
复制
            CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
            ASN1EncodableVector signedAttr = new ASN1EncodableVector();
            String ID_ADBE_REVOCATION = "1.2.840.113583.1.1.8";

            //TODO add message digest for sgning - nikhilW
            Attribute attr = new Attribute(CMSAttributes.messageDigest,  new DERSet(new DEROctetString(IOUtils.toByteArray(hashdata))));
            signedAttr.add(attr);
            
            //TODO generate pdf info archival and add it as CMS signed attribute - nikhilW
            ASN1EncodableVector pdfInfo = genPdfInfoArchival(signedAttr);
            Attribute ar = new Attribute(new ASN1ObjectIdentifier(ID_ADBE_REVOCATION),   new DERSet (new DERSequence(pdfInfo)));
            signedAttr.add(ar);
            
            List<Certificate> certList = new ArrayList<Certificate>();
            certList.addAll(Arrays.asList(certificateChain));
            Store certs = new JcaCertStore(certList);
            
            DefaultSignedAttributeTableGenerator sa = new DefaultSignedAttributeTableGenerator(new AttributeTable(signedAttr));
            SignerInfoGeneratorBuilder builder = new SignerInfoGeneratorBuilder(new BcDigestCalculatorProvider());
            
            builder.setSignedAttributeGenerator(sa);

请在google驱动器链接下面找到包含样例签名的pdf文件 hello_signed_ts_pdfarchivalinfo.pdf 署名

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 06:11:57

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

Pdf存档信息检索源代码在位置返回CRL流对象

代码语言:javascript
运行
复制
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());
        
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63169453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档