sábado, 24 de junio de 2017

Autenticación de cliente mediante certificado digital en Java

Supongo que a más de uno le habrá tocado lidiar con el nuevo servicio de la Agencia Tributaria para el envío de facturas, también conocido como SSII. Para quienes no tengan el gusto, les diré que se trata "simplemente" de una capa de servicios web que deben usar las empresas para el envío de la información tributaria, en este caso las facturas tanto emitidas como recibidas.

Dejando aparte que el servicio tiene mucho margen de mejora, especialmente en el tratamiento de los errores, a nivel técnico uno de los puntos más destacables es que se hace uso de una autenticación basada en certificados digitales.

Aunque de principio puede asustar un poco, la verdad es que usar certificados digitales para el intercambio en Java no tiene ninguna complejidad técnica, basta con definir como parámetros de la JVM la ruta absoluta donde se encuentra el

O si se prefiere hacer en el código, basta con añadir a los parámetros inicio de la JVM las siguientes entradas:

-Djavax.net.ssl.keystore=/ruta/al/archivo/certificado
-Djavax.net.ssl.keystorePassword=password

También es posible asignar estos valores en tiempo de ejecución, 

System.setProperty("javax.net.ssl.keystore", "/ruta/al/archivo/certificado");
System.setProperty("javax.net.ssl.keystorePassword", "password");

Como apunte el certificado a usar debe contener tanto la clave pública como la privada, habitualmente llevan la extensión pxf o p12. Además en este caso como la AEAT utiliza para el handshake un certificado "confiable" para Java, no es necesario definir el almacén de certificado de confianza (truststore).  

Personamente no me gusta dejar los certificados "sueltos" y si consultáis la web lo habitual es que ele certificado esté almacenado en una "keystore", que básicamente es un contenedor de certificados protegido por contraseña. La herramienta keytool de Java permite tanto la creación de los keystore y la gestión de los mismos. El mayor problema de keytool es que es una herramienta muy potente basada en línea de comando y por tanto tiene un montón de opciones y combinaciones, por lo que o tienes plantillas salvadas o estás consultando internet.

Una opción para el manejo de los keystores es KeyStore Explorer, permite la creación y la gestión de los keystores de forma muy sencilla, es "open source" y cuenta con versiones tanto para Windows, Mac y Linux.