Overview
En esta guía, aprenderá a usar el protocolo TLS para proteger su conexión a una implementación de MongoDB. TLS es un protocolo criptográfico que protege la comunicación entre su aplicación y MongoDB. Para configurar su conexión con TLS, habilite la opción TLS y proporcione sus certificados para su validación al crear un cliente.
De forma predeterminada, el controlador admite conexiones TLS/SSL a servidores MongoDB mediante la compatibilidad subyacente con TLS/SSL proporcionada por el JDK. Esto se puede cambiar mediante el comando API de Netty o la extensibilidad de la API de Java SE.
Tip
Prefiera Netty para aplicaciones asincrónicas
Recomendamos utilizar Netty para aplicaciones asíncronas porque admite E/S asíncrona y gestiona eficazmente un gran volumen de conexiones. Para aprender a usar Netty para configurar tus ajustes de TLS, consulta la sección Configuración de TLS/SSL usando Netty SslContext de esta guía.
API de MongoClient
Puede configurar el controlador para utilizar TLS/SSL especificando opciones en un ConnectionString o en una instancia MongoClientSettings.
Especifica TLS/SSL en ConnectionString
Incluya las siguientes declaraciones de importación:
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient;
Para especificar TLS/SSL en un ConnectionString, especifique ssl=true como parte de la cadena de conexión:
MongoClient mongoClient = MongoClients.create("mongodb://localhost/?ssl=true");
Especificar TLS/SSL en MongoClientSettings
Incluya las siguientes declaraciones de importación:
import com.mongodb.MongoClientSettings; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient;
Para especificar TLS/SSL en una instancia MongoClientSettings, establezca la propiedad enabled en true:
MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true)) .build(); MongoClient client = MongoClients.create(settings);
Configurar TLS/SSL mediante Netty SslContext
Incluya las siguientes declaraciones de importación:
import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.SslProvider;
Nota
Versión del paquete Netty
El controlador prueba la versión del paquete Netty io.netty:netty-all:4.1.87.Final
Para indicarle al controlador que utilice io.netty.handler.ssl.SslContext, configure NettyTransportSettings cuando defina MongoClientSettings su.
Utilice MongoClientSettings.Builder.transportSettings() y NettyTransportSettings.Builder.sslContext() para crear su configuración:
SslContext sslContext = SslContextBuilder.forClient() .sslProvider(SslProvider.OPENSSL) .build(); MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true)) .transportSettings(TransportSettings.nettyBuilder() .sslContext(sslContext) .build()) .build(); MongoClient client = MongoClients.create(settings);
Para obtener más detalles io.netty.handler.ssl.SslProvider sobre,consulte la documentación de Netty.
Especifique Java SE SSLContext en MongoClientSettings
Incluya las siguientes declaraciones de importación:
import javax.net.ssl.SSLContext; import com.mongodb.MongoClientSettings; import com.mongodb.MongoClient;
Para especificar javax.net.ssl.SSLContext con MongoClientSettings, establezca la propiedad sslContext:
SSLContext sslContext = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true).context(sslContext)) .build(); MongoClient client = new MongoClient(settings);
Deshabilitar la verificación del nombre de host
Por defecto, el controlador garantiza que el nombre de host incluido en el certificado SSL del servidor coincida con el nombre de host proporcionado al construir un MongoClient.
Si su aplicación necesita deshabilitar la verificación del nombre de host, debe indicarlo explícitamente en MongoClientSettings:
MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> { builder.enabled(true); builder.invalidHostNameAllowed(true); }) .build();
Tareas comunes de configuración de TLS/SSL
Esta sección se basa en la documentación para Oracle JDK, por lo que algunas partes pueden no ser aplicables a tu JDK o a la implementación TLS/SSL personalizada que utilices.
Configurar el almacén de confianza y el almacén de claves
Puede configurar almacenes de confianza y almacenes de claves específicos para el cliente utilizando javax.net.ssl.SSLContext.init(KeyManager[] km,
TrustManager[] tm, SecureRandom random), o puede establecer los predeterminados de JVM.
Establecer el almacenar de confianza por defecto
Una aplicación típica necesitará configurar varias propiedades del sistema JVM para garantizar que el cliente pueda validar el certificado TLS/SSL presentado por el servidor:
javax.net.ssl.trustStore: la ruta a un almacén de confianza que contiene el certificado de la autoridad firmantejavax.net.ssl.trustStorePassword:la contraseña para acceder a este almacén de confianza
El almacén de confianza normalmente se crea con el programa de línea de comandos keytool proporcionado como parte del JDK:
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <trust store password>
Establecer el almacén de claves predeterminado
Una aplicación típica también necesitará configurar varias propiedades del sistema JVM para garantizar que el cliente presente un certificado de cliente TLS/SSL al servidor MongoDB:
javax.net.ssl.keyStore: la ruta a un almacén de claves que contiene los certificados TLS/SSL de los clientesjavax.net.ssl.keyStorePassword:la contraseña para acceder a este almacén de claves
El almacén de claves se crea normalmente con keytool el openssl programa de línea de comandos o. Por ejemplo, si tiene un archivo con el certificado de cliente y su clave privada, y desea crear un almacén de claves en formato PKCS #,12 puede ejecutar el siguiente comando:
openssl pkcs12 -export -in <path to client certificate & private key file> -out <path to key store> -passout pass:<trust store password>
Para obtener más información sobre cómo configurar una aplicación Java para TLS/SSL, consulte la Guía de referencia de JSSE.
Forzar TLS v1.2
Algunas aplicaciones podrían querer forzar solo el protocolo TLS 1.2. Para ello, configure la propiedad del sistema jdk.tls.client.protocols en TLSv1.2.
Los entornos de ejecución de Java anteriores a Java 8 comenzaron a habilitar el protocolo TLS 1.2 solo en actualizaciones posteriores, como se muestra en la sección anterior. Para que el controlador fuerce el uso del protocolo TLS 1.2 con un entorno de ejecución de Java anterior a Java 8, asegúrese de que la actualización tenga habilitado TLS 1.2.
OCSP
Nota
El controlador no puede habilitar OCSP de forma predeterminada de forma individual MongoClient.
OCSP impulsado por el cliente
Una aplicación deberá configurar las siguientes propiedades de seguridad y del sistema JVM para garantizar que OCSP controlado por el cliente esté habilitado:
com.sun.net.ssl.checkRevocation: cuando se establece entrue, esta propiedad del sistema habilita la verificación de revocaciónocsp.enable:Cuando se establece entrue, esta propiedad de seguridad habilita OCSP controlado por el cliente
Para configurar una aplicación para que utilice OCSP basado en el cliente, debe estar configurada para conectarse a un servidor mediante TLS. Es necesario configurar estas propiedades del sistema para habilitar OCSP basado en el cliente.
Nota
El soporte para TLS provisto por el JDK utiliza un comportamiento de "error grave" en el caso de un respondedor OCSP no disponible, a diferencia de mongosh y los controladores que utilizan un comportamiento de "error leve".
Grapado OCSP
Importante
La siguiente excepción puede ocurrir al usar el grapado OCSP con entornos de ejecución de Java que usan el protocolo TLS 1.3 (Java 11 y superiores usan TLS 1.3 de manera predeterminada):
javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request
La excepción se debe a un problema conocido con TLS 1.3 en Java 11 y versiones posteriores. Para evitar esta excepción al usar entornos de ejecución de Java que utilizan el protocolo TLS 1.3, puede forzar la aplicación a usar el protocolo TLS 1.2. Para ello, configure la propiedad del sistema jdk.tls.client.protocols en TLSv1.2.
Una aplicación necesitará configurar varias propiedades del sistema JVM para configurar el grapado de OCSP:
jdk.tls.client.enableStatusRequestExtension: cuando se establece entrue(su valor predeterminado), esto habilita el grapado OCSP.com.sun.net.ssl.checkRevocation: cuando se establece entrue, esto permite la comprobación de revocación. Si esta propiedad no se establece entrue, se permitirá que la conexión proceda independientemente de la presencia o el estado de la información de revocación.
Para configurar una aplicación para usar el engrapado OCSP, la aplicación ya debe estar configurada para conectarse a un servidor mediante TLS, y el servidor debe estar configurado para engrapar una respuesta OCSP al certificado que devuelve como parte del protocolo de enlace TLS.
Para obtener más información sobre cómo configurar una aplicación Java para utilizar OCSP, consulte OCSP controlado por cliente y grapado de OCSP en la documentación de Java.