Introducción a SSL en Java

Parte superior de Java

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO

1. Información general

En este tutorial, presentaremos SSL y exploraremos cómo podemos usarlo en Java usando la API JSSE (Java Secure Socket Extension).

2. Introducción

En pocas palabras, Secured Socket Layer (SSL) permite una conexión segura entre dos partes , generalmente clientes y servidores.

SSL proporciona un canal seguro entre dos dispositivos que operan a través de una conexión de red. Un ejemplo habitual de SSL es permitir comunicaciones seguras entre navegadores web y servidores web.

En este caso específico, los navegadores web utilizarán conexiones HTTPS (S que significa seguras) para acceder a los recursos suministrados por distintos servidores web.

SSL es necesario para respaldar los tres principios principales de seguridad de la información:

  • Cifrado : protege las transmisiones de datos entre las partes
  • Autenticación : asegúrese de que el servidor al que nos conectamos sea el servidor adecuado
  • Integridad de los datos : garantizar que los datos solicitados son los que se entregan efectivamente

Java proporciona varias API basadas en seguridad que ayudan a los desarrolladores a establecer conexiones seguras con el cliente para recibir y enviar mensajes en formato cifrado:

  • Extensión Java Secured-Socket (JSSE)
  • Arquitectura de criptografía Java (JCA)
  • Extensión criptográfica de Java (JCE)

En las siguientes secciones, presentaremos la extensión Secure Socket que utiliza Java para permitir la comunicación segura.

3. API JSSE

Las API de seguridad de Java utilizan ampliamente el patrón de diseño Factory .

De hecho, todo se instancia utilizando una fábrica en JSSE.

3.1. SSLSocketFactory

El javax.net.ssl.SSLSocketFactory se utiliza para crear SSLSocket objetos.

Esta clase contiene tres grupos de API.

El primer grupo consta de un único método getDefault () estático que se utiliza para recuperar la instancia predeterminada que, a su vez, puede crear instancias SSLSocket .

El segundo grupo consta de cinco métodos que se pueden utilizar para crear instancias de SSLSocket :

  • Socket createSocket (cadena de host, puerto int)
  • Socket createSocket (String host, int port, InetAddress clientHost, int clientPort)
  • Socket createSocket (host InetAddress, puerto int)
  • Socket createSocket (host InetAddress, puerto int, clientHost InetAddress, puerto int client)
  • Socket createSocket (Socket socket, String host, int port, boolean autoClose)

Podemos usar esta clase directamente obteniendo la instancia predeterminada o usando un javax.net.ssl. Objeto SSLContext que contiene métodos para obtener una instancia de SSLSocketFactory .

3.2. SSLSocket

Esta clase extiende la clase Socket y proporciona un socket seguro. Estos enchufes son enchufes de corriente normales.

Además, agregan una capa de protecciones de seguridad sobre el protocolo de transporte de red subyacente.

Las instancias de SSLSocket construyen una conexión SSL a un host con nombre en un puerto específico.

Esto permite vincular el lado del cliente de la conexión a una dirección y puerto determinados.

3.3. SSLServerSocketFactory

La clase SSLServerSocketFactory es bastante similar a SSLSocketFactory con la diferencia de que crea instancias SSLServerSocket en lugar de instancias SSLSocket .

Por similitud, los métodos se denominan createServerSocket como análogo a la clase SSLSocketFactory .

3.4. SSLServerSocket

La clase SSLServerSocket es análoga a la clase SSLSocket . Los métodos de la clase SSLServerSocket son un subconjunto de los métodos de la clase SSLSocket . Actúan en el lado opuesto de una conexión SSL

4. Ejemplo de SSL

Proporcionemos un ejemplo de cómo podemos crear una conexión segura a un servidor:

String host = getHost(...); Integer port = getPort(...); SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault(); SSLSocket sslsocket = (SSLSocket) sslsocketfactory .createSocket(host, port); InputStream in = sslsocket.getInputStream(); OutputStream out = sslsocket.getOutputStream(); out.write(1); while (in.available() > 0) { System.out.print(in.read()); } System.out.println("Secured connection performed successfully"); 

En caso de que obtengamos el error “javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: falló la construcción de la ruta PKIX: sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar la ruta de certificación válida al objetivo solicitado mientras se establece la Conexión SSL ” , indica que no tenemos el certificado público del servidor que estamos intentando conectar en el almacén de confianza de Java.

El almacén de confianza es el archivo que contiene los certificados de confianza que utiliza Java para validar las conexiones seguras.

Para solucionar este problema, tenemos varias opciones:

  • agregue el certificado público del servidor al almacén de confianza de cacerts predeterminado utilizado por Java. al iniciar la conexión SSL
  • Configure javax.net. ssl . La variable de entorno trustStore para apuntar al archivo del almacén de confianza para que la aplicación pueda recoger ese archivo que contiene el certificado público del servidor al que nos estamos conectando.

Los pasos para instalar un nuevo certificado en el almacén de confianza predeterminado de Java son:

  1. extraer certificado del servidor: openssl s_client -connect server: 443
  2. importar certificado en el almacén de confianza usando keytool: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Una vez hecho esto, deberíamos poder ejecutar el ejemplo nuevamente y obtener el mensaje Conexión segura realizada con éxito .

5. Conclusión

En este artículo, presentamos SSL y JSSE API, que implementa SSL para Java. Al usar SSL y JSSE, podemos hacer que nuestras aplicaciones Java y las comunicaciones entre aplicaciones y dentro de la aplicación sean más seguras.

Como siempre, el código presentado en este artículo está disponible en Github.

Fondo de Java

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO