Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

TLS/SSL

En esta guía, podrá aprender cómo utilizar el protocolo TLS para proteger su conexión a una implementación de MongoDB. TLS es un protocolo criptográfico que asegura la comunicación entre tu aplicación y MongoDB. Para configurar tu conexión para utilizar TLS, habilita la opción de TLS y proporciona tus certificados para la validación al crear un cliente.

De manera predeterminada, el controlador admite conexiones TLS/SSL a servidores MongoDB utilizando el soporte subyacente para TLS/SSL proporcionado por el JDK. Esto se puede cambiar ya sea utilizando el API de Netty o la extensibilidad de API de Java SE.

Tip

Preferir Netty para aplicaciones asíncronas

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.

Puedes configurar el controlador para usar TLS/SSL especificando opciones en un ConnectionString o en una instancia MongoClientSettings.

Incluye las siguientes instrucciones 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");

Incluye las siguientes instrucciones 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, establece la propiedad enabled en true:

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true))
.build();
MongoClient client = MongoClients.create(settings);

Incluye las siguientes instrucciones 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.

Utiliza MongoClientSettings.Builder.transportSettings() y NettyTransportSettings.Builder.sslContext() para crear tu 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.

Incluye las siguientes instrucciones 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);

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 del host, debe indicar esto explícitamente en MongoClientSettings:

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.invalidHostNameAllowed(true);
})
.build();

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.

Se pueden configurar almacenes de confianza y almacenes de claves específicos para el cliente mediante javax.net.ssl.SSLContext.init(KeyManager[] km, TrustManager[] tm, SecureRandom random), o se pueden establecer los por defecto en la JVM.

Una aplicación típica deberá 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 una almacén de confianza que contiene el certificado de la autoridad firmante

  • javax.net.ssl.trustStorePassword: la contraseña para acceder a este trust store

La tienda de confianza suele crearse 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>

Una aplicación típica también necesitará establecer varias propiedades del sistema JVM para asegurar que el cliente presente un certificado de cliente TLS/SSL al servidor MongoDB:

  • javax.net.ssl.keyStoreAs: la ruta a un almacén de claves que contiene los certificados TLS/SSL de los clientes

  • javax.net.ssl.keyStorePassword: la contraseña para acceder a este almacén de claves

El almacén de claves suele crearse con el keytool o el programa de línea de comandos openssl. Por ejemplo, si tienes un archivo con el certificado de cliente y su llave privada, y deseas crear un almacén de claves en el formato PKCS #12, puedes 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, consulta la Guía de referencia de JSSE.

Algunas aplicaciones podrían querer forzar solo el protocolo TLS 1.2. Para ello, establezca 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 TLS 1.2 habilitado.

Nota

El controlador no puede habilitar OCSP por defecto de forma individual en MongoClient.

Una aplicación necesitará establecer las siguientes propiedades de sistema y seguridad de JVM para asegurarse de que OCSP impulsado por el cliente esté habilitado:

  • com.sun.net.ssl.checkRevocation: cuando se establece en true, esta propiedad del sistema habilita la verificación de revocación

  • ocsp.enableCuando se establece en true, esta propiedad de seguridad activa OCSP impulsado 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".

Importante

La siguiente excepción puede ocurrir al usar OCSP incorporar con entornos de ejecución Java que utilicen el protocolo TLS 1.3: (Java 11 y versiones posteriores usan TLS 1.3 por defecto):

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 utilizar entornos de ejecución de Java que operan en el protocolo TLS 1.3, se puede forzar a la aplicación a utilizar el protocolo TLS 1.2. Para ello, debe establecer la propiedad del sistema jdk.tls.client.protocols en TLSv1.2.

Una aplicación necesitará configurar varias propiedades del sistema JVM para configurar OCSP incorporar:

  • jdk.tls.client.enableStatusRequestExtension: al establecerse en true (su valor predeterminado), activa el OCSP incorporar.

  • com.sun.net.ssl.checkRevocation: cuando se establece en true, esto permite la comprobación de revocación. Si esta propiedad no se establece en true, 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 la incorporación de OCSP, la aplicación debe estar ya configurada para conectarse a un servidor usando TLS, y el servidor debe estar configurado para incorporar una respuesta OCSP al certificado que devuelve como parte del handshake TLS.

Para obtener más información sobre cómo configurar una aplicación Java para usar OCSP, consulta OCSP impulsado por el cliente y fijación de OCSP en la documentación de Java.

Volver

Limitar el tiempo de ejecución

En esta página