La seguridad es una prioridad indiscutible en el desarrollo de aplicaciones Java, el protocolo SSL (Secure Sockets Layer) juega un papel fundamental en la protección de la comunicación entre clientes y servidores. Sin embargo, como con cualquier tecnología, pueden surgir desafíos al momento de trabajar aplicaciones utilizando SSL. En esta entrada, exploraremos algunos problemas comunes relacionados con SSL en aplicaciones Java y les brindaré algunas soluciones prácticas para abordarlos.

Problema 1: Certificados no confiables o caducados

Cuando los certificados SSL no son confiables o han caducado, las conexiones seguras pueden fallar. Siempre debemos asegurarnos de manejar esta situación y para ello podemos hacerlo de la siguiente manera:

Solución: Configuración del TrustStore

Al configurar las propiedades de los certificados directamente en el código, podemos asegurarnos que siempre se verifique un único almacenamiento de certificados con un password en específico.

Debemos tener presente que al aplicar esto, nos aseguramos que la ubicación, nombre y contraseña del certificado no vayan a cambiar, sin embargo, la desventaja esque si a futuro se cambia esta información, también se tendría que aplicar al desarrollo.

System.setProperty("javax.net.ssl.trustStore", "ruta/al/almacen/keystore"); 
System.setProperty("javax.net.ssl.trustStorePassword", "password");

Problema 2: Handshake failure

Los errores en el proceso de handshake pueden ocurrir debido a incompatibilidades en los protocolos SSL/TLS, el handshake se da cuando se intercambian las clave cifradas entre conexiones seguras, si hay un error por protocolo, tamaño de cifrado o pérdida de integridad, se mostrará un error de handshake.

Solución: Configuración del protocolo SSL

Para asegurar que nuestra aplicación únicamente tenga comunicación con un tipo de protocolo específico, podemos establecer la propiedad https.protocols, de esta manera si la conexión con la que se comunica la aplicación es SSL pero no posee los protocolos establecidos, no se brindará la conexión.

System.setProperty("https.protocols", "TLSv1.2,TLSv1.3");

Problema 3: Hostname verification

Si el hostname del servidor no coincide con el certificado, se producirá una excepción.

Solución: Desactivar la verificación del hostname (no recomendado para entornos de producción)

Cuando se trabaja en entornos clusterizados, es importante tener en cuenta el impacto que puede tener la verificación del hostname en nuestra aplicación. Aunque desactivar esta verificación puede parecer una solución funcional, es importante destacar que esto reduce la seguridad y, por lo tanto, no se recomienda su uso en entornos productivos. Sin embargo, en los entornos de desarrollo (DEV), de control de calidad (QA) o de prueba de aceptación de usuario (UAT), se puede considerar esta opción. Recuerda evaluar cuidadosamente los riesgos y las necesidades de seguridad antes de tomar una decisión.

HostnameVerifier allHostsValid = (hostname, session) -> true;
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

Casos de uso

Este tipo de soluciones podrían ser eficientes en algunos casos de uso, para ello se los detallo acontinuación:

  1. Conexión a un servidor con certificado autofirmado: En entornos de desarrollo o pruebas, es común utilizar certificados autofirmados para cifrar las comunicaciones, ya que son fáciles de generar y no requieren la intervención de una autoridad de certificación. Sin embargo, al conectarse a un servidor con un certificado autofirmado, es posible que la aplicación arroje una excepción debido a que el certificado no es confiable. La solución aquí es configurar adecuadamente el TrustStore de la aplicación Java para que reconozca y confíe en el certificado autofirmado.
  2. Uso de protocolos específicos: En algunos entornos, puede ser necesario cumplir con estándares de seguridad específicos que requieren el uso de protocolos SSL/TLS particulares. Al configurar los protocolos SSL/TLS adecuados mediante la propiedad https.protocols, la aplicación garantiza que las conexiones se establezcan utilizando los estándares de seguridad requeridos.
  3. Ambientes con varias aplicaciones: En entornos donde coexisten varias aplicaciones Java, cada una puede tener requisitos de seguridad únicos. Es importante gestionar los TrustStores de manera adecuada para cada aplicación, asegurandonos de que tengan acceso solo a los certificados necesarios para sus conexiones seguras. Esto evita posibles conflictos y garantiza que cada aplicación confíe solo en los certificados relevantes para su contexto.
  4. Aplicaciones internas: En ciertos casos, cuando trabajamos con entornos internos que no están expuestos a Internet, la desactivación de la verificación del hostname puede ser considerada. Sin embargo, esta práctica se debe realizar con precaución y generalmente no se recomienda en entornos de producción, ya que puede exponer la aplicación a posibles ataques de intermediarios maliciosos.

Abordar los problemas comunes de SSL en aplicaciones Java requiere un enfoque cuidadoso y una comprensión profunda de la arquitectura y la seguridad del ambiente. Al implementar las soluciones vistas y ajustarlas según las necesidades específicas de cada aplicación, los desarrolladores podemos garantizar conexiones seguras y robustas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *