Bloque de construcción de firma electrónica CEF «Hola mundo»

El componente básico de la firma electrónica del CEF es una herramienta poderosa, pero puede resultar complejo para las agencias más pequeñas. Esta serie ofrece ejemplos prácticos para que los desarrolladores de Java comiencen a utilizar firmas digitales compatibles con eIDAS.

3 Oct
,
2020
24 Jun
,
2025
# min read
Proceso de firma digital con la interfaz de plataforma eID Easy en la pantalla de una computadora.

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.

More latest articles

See all news
See all news