pdf - ¿Cómo habilitar LTV para una firma de marca de tiempo?
itext (1)
Este es el código de muestra sobre el que trata esta pregunta:
public void addLtv(String src, String dest, OcspClient ocsp, CrlClient crl, TSAClient tsa) throws IOException, DocumentException, GeneralSecurityException
{
PdfReader r = new PdfReader(src);
FileOutputStream fos = new FileOutputStream(dest);
PdfStamper stp = PdfStamper.createSignature(r, fos, ''/0'', null, true);
LtvVerification v = stp.getLtvVerification();
AcroFields fields = stp.getAcroFields();
List<String> names = fields.getSignatureNames();
String sigName = names.get(names.size() - 1);
PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
if (pkcs7.isTsp())
{
v.addVerification(sigName, ocsp, crl,
LtvVerification.CertificateOption.SIGNING_CERTIFICATE,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
else
{
for (String name : names)
{
v.addVerification(name, ocsp, crl,
LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
}
PdfSignatureAppearance sap = stp.getSignatureAppearance();
LtvTimestamp.timestamp(sap, tsa, null);
}
Este código identifica el campo de firma rellenado más recientemente del PDF y verifica si es una marca de tiempo del documento o una firma habitual.
Si se trata de una marca de tiempo del documento, el código agrega información de validación solo para esta marca de tiempo del documento. De lo contrario, el código agrega información de validación para todas las firmas.
(El flujo de trabajo asumido detrás de esto es que el documento se firma (para certificación y / o aprobación) varias veces primero, y luego el documento ingresa a los ciclos LTV agregando información de validación y marcas de tiempo del documento, pero ya no hay firmas habituales. puede variar y, por lo tanto, también la lógica de su programa).
Solo después de hacer todo esto, se agrega una nueva marca de tiempo del documento.
Para esta marca de tiempo finalmente agregada, no se agrega explícitamente información de validación al PDF (si las marcas de tiempo del documento de la misma TSA se han aplicado en breve sucesión, la información de validación incluida para una marca de tiempo anterior puede ser aplicable). Y esta es la razón por la cual Adobe Reader / Acrobat generalmente no considera este sello de tiempo de documento LTV habilitado.
Si también necesita información de validación para esta marca de tiempo del documento final, simplemente aplique este método (el mismo que el método anterior, simplemente sin agregar una marca de tiempo del documento) al archivo con la marca de tiempo del documento:
public void addLtvNoTS(String src, String dest, OcspClient ocsp, CrlClient crl) throws IOException, DocumentException, GeneralSecurityException
{
PdfReader r = new PdfReader(src);
FileOutputStream fos = new FileOutputStream(dest);
PdfStamper stp = new PdfStamper(r, fos, ''/0'', true);
LtvVerification v = stp.getLtvVerification();
AcroFields fields = stp.getAcroFields();
List<String> names = fields.getSignatureNames();
String sigName = names.get(names.size() - 1);
PdfPKCS7 pkcs7 = fields.verifySignature(sigName);
if (pkcs7.isTsp())
{
v.addVerification(sigName, ocsp, crl,
LtvVerification.CertificateOption.SIGNING_CERTIFICATE,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
else
{
for (String name : names)
{
v.addVerification(name, ocsp, crl,
LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL,
LtvVerification.CertificateInclusion.NO);
}
}
stp.close();
}
Antecedentes
La razón por la cual el ejemplo iText
addLtv
no crea (necesariamente) archivos PDF habilitados para LTV es que está más cerca de las mejores prácticas para LTV propuestas por ETSI en la especificación PAdES que para las mejores prácticas de Adobe para LTV.
De acuerdo con ETSI TS 102 778-4 V1.1.2 (2009-12), la estructura de un documento PDF al que se aplica LTV se ilustra en la figura 2.
El tiempo de vida de la protección se puede extender más allá de la vida útil del último sello de tiempo del documento aplicado agregando más información DSS para validar el sello de tiempo del último documento anterior junto con un nuevo sello de tiempo del documento. Esto se ilustra en la figura 3.
Por otro lado, según Adobe ( según lo escrito por su evangelista en PDF Leonard Rosenthol en la lista de correo iText en enero de 2013 ),
LTV habilitado significa que toda la información necesaria para validar el archivo (menos los certificados raíz) está contenida dentro. Entonces esta declaración tuya sería cierta.
el PDF está firmado correctamente y contiene todos los certificados necesarios, una respuesta válida de CRL u OSCP para cada certificado
Pero dado que la única forma de que esa afirmación sea verdadera es la presencia de DSS, debe tener DSS para que aparezca LTV habilitado. No se requiere marca de tiempo (nivel normal o de documento).
Debido a esta divergencia, los documentos PDF con LTV según ETSI generalmente son presentados por el software de Adobe para tener una marca de tiempo de documento no habilitada para LTV.
Ver también
- habilitar LTV en iText
- Firma habilitada para LTV en PDF
- Firma digital con marca de tiempo en Java
Estoy usando iText 5.5.3 para firmar documentos PDF. Necesito que estos documentos tengan una marca de tiempo y estén habilitados para LTV. Seguí las instrucciones y utilicé el método addLtv (ejemplo de código 5.9, página 137 en el documento técnico de Lowagie). Recibo un PDF con 2 firmas, lo cual es normal: el primero es mi propia firma, el segundo es la marca de tiempo a nivel de documento.
Sin embargo, Acrobat me dice que mi firma está habilitada para LTV, pero la firma de marca de tiempo no:
Imagen de Acrobat Pro XI http://img15.hostingpics.net/pics/727285so2.jpg
Esto se debe a que la información de revocación del certificado de marca de tiempo no está incrustada en el documento:
Falta información de revocación 1 http://img15.hostingpics.net/pics/491507so2a.jpg
Falta información de revocación 2 http://img15.hostingpics.net/pics/312720so2b.jpg
Según tengo entendido, el método addLtv debería obtener toda la información de revocación necesaria e incrustarla en el documento. ¿Es correcto o debo obtener e insertar "manualmente" esta información?