El componente básico de firma electrónica del CEF es un potente conjunto de herramientas para implementar firmas digitales de acuerdo con la Reglamento eIDAS. Sin embargo, empezar puede resultar abrumador debido a la complejidad de los componentes involucrados. Como resultado, muchas pequeñas agencias de desarrollo evitan los proyectos que requieren firmas electrónicas calificadas.
En el otro extremo del espectro, las grandes empresas con amplios recursos, como Nowina (desarrollador del DSS y de la implementación de referencia de la UE, con sede en Luxemburgo) y Nortal (un implementador experimentado de Estonia) ofrecen servicios profesionales en este campo.
Esta publicación es la primera de una serie centrada en ayudar a los desarrolladores de Java experimentados a iniciar su viaje hacia el desarrollo de la firma electrónica en Europa:sin pasar semanas navegando por el ecosistema.
Recursos útiles
Ejemplo de código fuente: GitHub — Ejemplos de firmas electrónicas CEF
Código fuente de la biblioteca DSS: GitHub — Componentes de DSS
Documentación: Documentación del DSS
Aplicación web de demostración: Demostración de validación de firmas
Pila tecnológica
En esta guía, utilizaremos:
- Bota de primavera
- experto
- Biblioteca DSS (Servicios de firma digital)
Nuestro primer objetivo es firmar un PDF usando un pág. 12
archivo clave con Línea base B de PAdES nivel.
Paso 1: Agregar dependencias de DSS a pom.xml
Comience por definir la versión y el repositorio del DSS:
<properties>
<java.version>14</java.version>
<dss.groupId>eu.europa.ec.joinup.sd-dss</dss.groupId>
<dss.version>5.7</dss.version>
</properties>
<repositories>
<repository>
<id>cefdigital</id>
<url>https://ec.europa.eu/cefdigital/artifact/content/repositories/esignaturedss/</url>
</repository>
</repositories>
A continuación, incluya los módulos DSS necesarios para Firma de PAdES:
<dependencies>
<dependency>
<groupId>${dss.groupId}</groupId>
<artifactId>dss-enumerations</artifactId>
<version>${dss.version}</version>
</dependency>
<dependency>
<groupId>${dss.groupId}</groupId>
<artifactId>dss-service</artifactId>
<version>${dss.version}</version>
</dependency>
<dependency>
<groupId>${dss.groupId}</groupId>
<artifactId>dss-pades</artifactId>
<version>${dss.version}</version>
</dependency>
<dependency>
<groupId>${dss.groupId}</groupId>
<artifactId>dss-pades-pdfbox</artifactId>
<version>${dss.version}</version>
</dependency>
<dependency>
<groupId>${dss.groupId}</groupId>
<artifactId>dss-token</artifactId>
<version>${dss.version}</version>
</dependency>
</dependencies>
Paso 2: Firmar un PDF con un archivo.p12
Cree un controlador o servicio de Spring Boot con la siguiente lógica:
Parte 1: Preparar los datos de la firma
DSSDocument toSignDocument = new FileDocument("src/main/resources/test.pdf");
Pkcs12SignatureToken signingToken = new Pkcs12SignatureToken(
"src/main/resources/teststore.p12",
new KeyStore.PasswordProtection("123456".toCharArray())
);
DSSPrivateKeyEntry privateKey = signingToken.getKeys().get(0);
CertificateToken signerCert = privateKey.getCertificate();
PAdESSignatureParameters parameters = new PAdESSignatureParameters();
parameters.setSignatureLevel(SignatureLevel.PAdES_BASELINE_B);
parameters.setSigningCertificate(signerCert);
CommonCertificateVerifier certificateVerifier = new CommonCertificateVerifier();
PAdESService service = new PAdESService(certificateVerifier);
ToBeSigned dataToSign = service.getDataToSign(toSignDocument, parameters);
Parte 2: Firmar y adjuntar
SignatureValue signatureValue = signingToken.sign(dataToSign, DigestAlgorithm.SHA256, privateKey);
DSSDocument signedFile = service.signDocument(toSignDocument, parameters, signatureValue);
InputStreamResource resource = new InputStreamResource(signedFile.openStream());
Validación de la firma
Una vez firmado, pruebe el resultado con el Aplicación web DSS. Nota:
- El formato, la identificación del certificado y las comprobaciones criptográficas deben pase.
- Si usa un certificado autofirmado, espere una advertencia:
NO SE HA ENCONTRADO NINGUNA CADENA_CERTIFICADO_DE_CERTIFICADO_*
. Esto es normal, a menos que su certificado sea emitido por un CA de confianza.
Ejemplo de resumen del resultado de la validación
- Comprobación de formato: ✅ Aprobado
- Integridad de firmas: ✅ Aprobado
- Verificación criptográfica: ✅ Aprobado
- Validación de certificados: ⚠️ Indeterminado (
NO SE HA ENCONTRADO NINGUNA CADENA_CERTIFICADO_DE_CERTIFICADO_*
)
Incluso con esta advertencia, la firma en sí misma es estructuralmente válida.