如何在签署 pdf 文件时将时间戳属性添加到认证详细信息

How to add Timestamp attribute to certification detail when signing pdf file

我想在证书中显示时间戳属性,如图所示

我应该在签名中设置什么?

这是我添加标志信息的代码:

private SignerInformation signTimeStamp(SignerInformation signer) throws IOException, TSPException {
    AttributeTable unsignedAttributes = signer.getUnsignedAttributes();

    ASN1EncodableVector vector = new ASN1EncodableVector();
    if (unsignedAttributes != null) {
        vector = unsignedAttributes.toASN1EncodableVector();
    }

    byte[] token = this.tsaClient.getTimeStampToken(signer.getSignature());

    ASN1ObjectIdentifier oid = PKCSObjectIdentifiers.id_aa_signatureTimeStampToken;
    ASN1Encodable signatureTimeStamp = new Attribute(oid, new DERSet(ASN1Primitive.fromByteArray(token)));

    vector.add(signatureTimeStamp);
    Attributes signedAttributes = new Attributes(vector);
    // replace unsignedAttributes with the signed once
    return SignerInformation.replaceUnsignedAttributes(signer, new AttributeTable(signedAttributes));
}

总结评论...

检查您的示例文档后,很明显您应用的时间戳是正确的。特别是你应该得到你在证书查看器对话框屏幕截图中标记的较低消息:

另一方面,您的代码对您是否获得在该屏幕截图中标记的其他条目没有影响:

该条目是签名者 X.509 证书的扩展,其中该证书的颁发者提供了时间戳服务的地址,该服务可用于为由与该证书关联的私钥创建的签名添加时间戳。

因此,该条目不一定包含用于创建实际时间戳的服务器,它只是一个提议或建议。

因此,如果您的屏幕截图中与两个标记相连的框声称标记的 TSA URL 与安全时间戳时间之间存在某种必要关系,那是错误的。