我们在生成签名时添加了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的吊销信息属性:
adbe-revocationInfoArchival OBJECT IDENTIFIER ::=
{ adbe(1.2.840.113583) acrobat(1) security(1) 8 }
Adobe的吊销信息属性值具有ASN.1类型的RevocationInfoArchival:
/**
** 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中:
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中添加这个签名
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 署名
任何帮助都将不胜感激。
发布于 2020-08-05 06:11:57
我已经使用下面的java源代码检查了pdf中添加的属性。还有iText Java实用程序,它将调试pdf对象树,或者从我的Google驱动器链接下载iTextRUP Java下载它,运行它与java -jar jar-name
一起运行,它将帮助调试pdf对象。
Pdf存档信息检索源代码在位置返回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());
}
https://stackoverflow.com/questions/63169453
复制相似问题