我已经阅读了许多关于如何使用iText启用pdf ltv的问题/答案。他们俩都不为我工作。我有一个pdf的蒸汽,我设置了一个签名字段,然后使用它来调用SignDistached方法并对pdf进行签名。我使用:
signer.signDetached(new BouncyCastleDigest(), pks, chain,
Collections.singleton(crlClient), ocspClient, tsc,0, subfilter);
但什么都没发生。我已经读到,你必须包括所有的证书,除了从根。我添加了我的私人证书链(我使用它来签署pdf),但我还没有找到一种可能的方式包括TSA的证书。
我使用iText版本7. X。
KeyStore ks = getKeyStore();
Certificate[] chain = null;
Enumeration<String> al = ks.aliases();
for (Enumeration<String> l = al; l.hasMoreElements();) {
String alias = (String) l.nextElement();
chain = ks.getCertificateChain(alias);
}
PrivateKey pk = (PrivateKey) ks.getKey(ks.aliases().nextElement(), "******".toCharArray());
IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, BouncyCastleProvider.PROVIDER_NAME);
OCSPVerifier ocspVerifier = new OCSPVerifier(null, null);
OcspClientBouncyCastle ocspClient = new OcspClientBouncyCastle(ocspVerifier);
String url = CertificateUtil.getCRLURL((X509Certificate) chain[0]);
CrlClientOnline crlClient = new CrlClientOnline(url);
try {
signer.signDetached(new BouncyCastleDigest(), pks, chain, Collections.singleton(crlClient), ocspClient, tsc,
0, subfilter);
} catch (Exception ex) {
System.out.println("Tzizzzzzzzzzzzzzzz" + ex.getCause());
}
private KeyStore getKeyStore()
throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("tsaPath"), "****".toCharArray());
ks.load(new FileInputStream("p12Path"), "*******".toCharArray());
return ks;
}
一般来说,LTV无法启用示例签名。
首先,默认情况下,您的签名者证书不是来自Adobe Reader信任的CA,即CA证书既不在AATL上,也不在EUTL上。除非以某种方式信任签名者,否则PDF阅读器永远不会将签名称为“启用LTV的”。
此外,签名者证书没有任何AIA(授权信息访问)扩展,签名代码可以通过该扩展确定从中检索颁发者证书或吊销信息的位置。丢失的信息使自动检索证书和撤销信息变得不可能,无需进一步的ado。
因此,即使CA是可信的,自动启用LTV仍然需要自定义代码。
在这里的评论过程中(以及与iText支持部门的沟通中),事实证明,提供的示例签名不具有代表性;另一方面,还有其他相关的边界条件,您最终得到了一个在用例中创建支持LTV的签名的例程。
你的答案中可以找到关于这个程序的详细信息。
几个小时后,我想出了一个解决办法。需要明确的是,Adobe有自己的信任库,所以你要么使用他们的证书,要么使用windows的信任库,相应地配置AC Reader,并在那里添加根证书。正如大家提到的,你应该在你的PDF文档中包含所有的认证链。您可以访问我的GitHub项目,以查看一个工作示例,该示例使用来自ERMIS的iText 7和timepstap对PDF文档进行签名、使用私钥加密并启用ltv。
使ltv启用示例:
private void ltvEnable(PdfSigner signer, ByteArrayOutputStream baos, OutputStream os, String name,
OcspClientBouncyCastle ocspClient, CrlClientOnline crlClient, CustomTSAClient tsc) {
ByteArrayInputStream signedPdfInput = new ByteArrayInputStream(baos.toByteArray());
try {
PdfReader pdfReader = new PdfReader(signedPdfInput);
PdfDocument document = new PdfDocument(pdfReader.setUnethicalReading(true), new PdfWriter(os),
new StampingProperties().useAppendMode());
LtvVerification ltvVerification = new LtvVerification(document);
ltvVerification.addVerification(name, ocspClient, crlClient, LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES);
ltvVerification.merge();
document.getCatalog().getPdfObject().getAsDictionary(PdfName.DSS).getAsArray(PdfName.Certs)
.add(new PdfStream(
IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("HPARCA_CA.cer"))));
document.close();
pdfReader.close();
} catch (IOException | GeneralSecurityException e) {
LOG.error("Error while making signature ltv enabled");
}
}
棘手的零件参数:
OCSPVerifier ocspVerifier = new OCSPVerifier(null, null);
OcspClientBouncyCastle ocspClient = new OcspClientBouncyCastle(ocspVerifier);
CrlClientOnline crlClient = new CrlClientOnline();
以防有人对adobeLTV有问题。与itext5中的操作相同,但仍需在itext7中完成,才能启用AdobeLTV,您需要自行创建文档安全存储,并在间接引用中添加有关验证数据/ocsp/crls/certs的信息。
https://github.com/mkl-public/testarea-itext7/blob/master/src/main/java/mkl/testarea/itext7/signature/AdobeLtvEnabling.java
我是在朝着正确的方向前进,还是根本不可能? 我已经能够实现一个自定义的,它由和一个自定义的支持。我只是想知道是否可以使用来实现这一点,因为严格模式会抱怨中的游标没有显式关闭。 任何帮助都将不胜感激。 我猜想方法有一些问题,因为它调用。这适用于该视图中的第一个条目,但不适用于后续条目。在这一点上我不太确定出了什么问题。 更新2 所以我已经确定了问题。问题是TextWatcher的方法。选择终止第一个
WebSocket 规范定义了一种 API,可在网络浏览器和服务器之间建立"套接字"连接。 简单地说:客户端和服务器之间存在持久的连接,而且双方都可以随时开始发送数据。 Nutz为WebSocket准备了什么? 请下载最新的nutz-plugins-websocket及websocket api, 然后只需要一个类, 即可完成websocket的基础集成. @ServerEndpoint(val
这个特性被喊了好几个版本了,并且先后被报了好几个 Issue: Issue 323 Issue 369 加上今天是个风和日丽的日子,Nutz.Mvc 重构完毕。架构这么灵活强大, 那么我就把这个特性加上吧,呵呵。 注意, Nutz支持的是Restful风格的映射, 但并非一个Restful实现. 如何使用 REST Nutz.Mvc 对于 REST 的支持,包括4个常用方法及通用定义方法: GET
ACL (Access Control List, 访问控制列表) 具有 超级用户 的 ACL 没有用户的 ACL: 对于没有身份验证或用户登录的系统尤其有用。 没有资源的 ACL: 某些场景可能只针对资源的类型, 而不是单个资源, 诸如 write-article, read-log等权限。 它不控制对特定文章或日志的访问。 RBAC (基于角色的访问控制) 支持资源角色的RBAC: 用户和资源
我们正在尝试启用签名LTV。我正在使用下面的代码添加验证。签名时。isTsp()为false,PDF表示签名未启用LTV,但在另一种情况下(Signature.isTsp()为true),它显示为有效。当我们打开PDF并尝试通过右键单击签名手动添加验证信息时,它将启用LTV,而不会出现任何问题。不知道我们在这里遗漏了什么。任何输入都将非常有用。
对于Requests,如果你有问题或者建议,可以通过下面几种方法得到支持: StackOverflow 如果你的问题不包含敏感或私有信息,或者你能将这些信息匿名化,那你就可以在 StackOverflow 上使用 python-requests 标签提问。 发送推文 如果你的问题在140个字符内描述,欢迎在 twitter 上发送推文至 @kennethreitz, @sigmavirus24,