在英语中,它表示“签名包括嵌入的时间戳”和“签名启用LTV”。以下是我使用的代码:
PrivateKey pk = // get pk from an encrypting certificate created using encrypting file system
Certificate[] chain = ks.getCertificateChain(alias);
PdfReader reader = new PdfReader(src);
FileOutputStream fout = new FileOutputStream(dest);
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
ExternalSignature signature = new PrivateKeySignature(pk, "SHA-512", "SunMSCAPI");
TSAClient tsc = null;
String url = // TSA URL
tsc = new TSAClientBouncyCastle(url, null, null, 4096, "SHA-512");
List<CrlClient> crlList = new ArrayList<>();
crlList.add(new CrlClientOnline(chain));
ExternalDigest digest = new BouncyCastleDigest();
MakeSignature.signDetached(sap, digest, signature, chain, crlList, null, tsc, 0, CryptoStandard.CMS);
基于
this answer
,我需要一种方法将TSA证书的CRL获取到
CrlList
但是我如何获得TSA证书?我需要做一个
timestamp-query
请求TSA并读取响应,然后将其添加到
CrlList公司
MakeSignature.signDetached
当它呼叫时
sgn.getEncodedPKCS7
. 注意,我使用的是免费的TSA服务器。
时间戳详细信息:
更新
由于它是一个免费的TSA服务器,我只需要在Adobe Trusted Certificates中添加TSA服务器证书,现在它可以工作了。
签名详细信息:
基于
this link
启用LTV意味着验证文件所需的所有信息(减去根证书)都包含在PDF中。因此,如果PDF签名正确,并且包含所有必要的证书和每个证书的有效CRL或OSCP响应,并且如果它包括CRL和OCSP上的签名,而不仅仅是签名证书,则PDF启用LTV。看起来我满足了所有这些要求,还是我遗漏了什么?如果是这样,我怎么知道缺少什么来获得支持LTV的pdf?