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
/ /

Habilitar TLS/SSL en una Conexión

En esta guía, puedes aprender cómo conectarte a instancias de MongoDB con el TLS/SSLProtocolo de seguridad que utiliza la compatibilidad subyacente TLS/SSL en el JDK. Para configurar su conexión para que use TLS/SSL, habilite la configuración de TLS/SSL en ConnectionString o MongoClientSettings.

Nota

Depuración de TLS/SSL

Si tiene problemas para configurar su conexión TLS/SSL, puede utilizar el -Djavax.net.debug=all propiedad del sistema para ver más instrucciones de registro. Consulta la guía de Oracle para depurar conexiones TLS/SSL para obtener más información.

Puedes habilitar TLS/SSL para la conexión a tu instancia de MongoDB de dos maneras diferentes: a través de un parámetro en tu cadena de conexión o usando un método en la clase MongoClientSettings.Builder.

Nota

Si te conectas utilizando el protocolo DNS lista de nodos iniciales, indicado por el prefijo mongodb+srv en tu cadena de conexión, el driver habilita TLS/SSL. Para deshabilitarlo, establezca el valor del parámetro tls o ssl a false en su cadena de conexión o instancia MongoClientSettings.

Para obtener más información sobre el comportamiento de conexión cuando se utiliza una lista de nodos iniciales DNS, consulte la sección SRV Connection Format en el manual del Servidor.

Para activar TLS/SSL en una conexión con un ConnectionString, asigne al parámetro de cadena de conexión tls un valor de true en la cadena de conexión pasada a MongoClients.create():

MongoClient mongoClient = MongoClients.create("mongodb+srv://<db_username>:<db_password>@<cluster-url>?tls=true");

La siguiente tabla describe el parámetro que puedes incluir en tu cadena de conexión para modificar el comportamiento TSL del driver:

Nombre de la opción
Tipo
Descripción

ssl

booleano

Especifica que todas las comunicaciones con las instancias de MongoDB deben

utilice TLS/SSL. Reemplazado por la opción tls.

Default: false

tls

booleano

Especifica que todas las comunicaciones con las instancias de MongoDB deben

utilizar TLS. Sustituye la opción ssl.

Default: false

tlsInsecure

booleano

Especifica que el controlador debe permitir nombres de host no válidos para TLS

conexiones. Tiene el mismo efecto que configurar tlsAllowInvalidHostnames en true. Para configurar restricciones de seguridad TLS de otras maneras, utilice un custom SSLContext.

Default: false

tlsAllowInvalidHostnames

booleano

Especifica que el driver debe permitir nombres de host no válidos en el

certificado para conexiones TLS. Anula sslInvalidHostNameAllowed.

Default: false

Para configurar las opciones de conexión TLS/SSL de MongoClient mediante la clase MongoClientSettings.Builder, encadena el método applyToSslSettings(). Establece la propiedad enabled en true en el bloque SslSettings.Builder para activar TLS/SSL:

MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder().applyConnectionString(new ConnectionString("<your connection string>"))
.applyToSslSettings(builder ->
builder.enabled(true))
.build());

La siguiente tabla describe los métodos que puede encadenar a su configuración para modificar el comportamiento TSL del controlador:

Método
Descripción

applyConnectionString()

Usa los parámetros de un objeto ConnectionString.

applySettings()

Utiliza la configuración TLS/SSL especificada en un objeto SslSettings.

context()

Establece el SSLContext para usar cuando habilites TLS/SSL.

enabled()

Si se debe habilitar TLS/SSL. (Debe habilitar esto para los clústeres de Atlas).

invalidHostNameAllowed()

Determina si se permite una discrepancia entre el nombre de host del servidor y el nombre de host especificado por el certificado TLS.

Las aplicaciones Java que inician solicitudes TLS/SSL requieren acceso a certificados criptográficos que demuestren la identidad tanto de la propia aplicación como de otras aplicaciones con las que interactúa la aplicación. Puedes configurar el acceso a estos certificados en tu aplicación mediante los siguientes mecanismos:

  • La tienda de confianza JVM y la tienda de claves JVM

  • Un almacén de confianza específico del cliente y un almacén de claves

Nota

Las siguientes secciones se basan en la documentación de Oracle JDK, por lo que es posible que algunas no se apliquen a su JDK o a su implementación de TLS/SSL personalizada.

Nota

Por defecto, el JRE incluye muchos certificados públicos comúnmente utilizados de autoridades de firma como Let's Encrypt. Como resultado, puedes conectarte a instancias de MongoDB Atlas (o cualquier otro servidor cuyo certificado esté firmado por una autoridad en el almacén de certificados por defecto del JRE) con TLS/SSL sin configurar el almacén de confianza.

El almacén de confianza de la JVM guarda certificados que identifican de manera segura otras aplicaciones con las que interactúa tu aplicación Java. Al utilizar estos certificados, tú aplicación puede demostrar que la conexión con otra aplicación es legítima y está protegida contra la manipulación de terceros.

Si tu instancia de MongoDB utiliza un certificado firmado por una autoridad que no se encuentra en el almacén de certificados por defecto de JRE, tu aplicación debe configurar dos propiedades del sistema para iniciar las solicitudes SSL/TLS. Estas propiedades garantizan que su aplicación pueda validar el certificado TLS/SSL presentado por una instancia de MongoDB conectada.

  • 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 al trust store definida en javax.net.ssl.trustStore

Puedes crear un almacén de confianza con la herramienta de línea de comandos keytool proporcionada como parte del JDK:

keytool -importcert -trustcacerts -file <path to certificate authority file>
-keystore <path to trust store> -storepass <password>

Nota

Por defecto, las instancias de MongoDB no realizan la validación del certificado de cliente. Debe configurar el almacén de claves si configuró su instancia de MongoDB para validar los certificados de cliente.

El almacén de claves de la JVM guarda certificados que identifican de forma segura su aplicación Java ante otras aplicaciones. Con estos certificados, otras aplicaciones pueden demostrar que la conexión con su aplicación es genuina y segura contra manipulaciones externas.

Una aplicación que inicia solicitudes TLS/SSL debe configurar dos propiedades del sistema JVM para garantizar que el cliente presente un certificado TLS/SSL a la implementación de MongoDB:

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

  • javax.net.ssl.keyStorePassword: la contraseña para acceder al almacén de claves definido en javax.net.ssl.keyStore

Puedes crear una tienda de llaves con la herramienta de línea de comandos keytool o openssl.

Para obtener más información sobre cómo configurar una aplicación Java para utilizar TLS/SSL, consulta la Guía de referencia JSSE.

Puede configurar un almacén de confianza y un almacén de claves específicos para el cliente mediante el método init() de la clase SSLContext.

Puedes encontrar un ejemplo de cómo configurar un cliente con una instancia de SSLContext en la Personalización de la configuración de TLS/SSL con una sección SSLContext de esta guía.

Para obtener más información sobre la clase SSLContext, consulta la documentación de la API para Contexto SSL.

Por defecto, el driver asegura que el nombre de host incluido en los certificados TLS/SSL del servidor coincida con los nombres de host proporcionados al construir un MongoClient. Para deshabilitar la verificación del nombre de host en su aplicación, puede desactivarla explícitamente configurando la propiedad invalidHostNameAllowed del builder como true en el lambda builder applytoSslSettings():

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

Advertencia

Desactivar la verificación del nombre de host puede hacer que tu configuración sea insegura. Desactive la verificación del nombre de host únicamente con fines de prueba o cuando no haya otra alternativa.

Para restringir su aplicación a fin de utilizar únicamente el protocolo TLS 1.2, configure la propiedad del sistema jdk.tls.client.protocols en "TLSv1.2".

Nota

Las Entornos de Ejecución de Java (JRE) previos a Java 8 solo activaban el protocolo TLS 1.2 en las versiones de actualizar. Si tu JRE no ha activado el protocolo TLS 1.2, actualiza a una versión más reciente para conectarte utilizando TLS 1.2.

Si su configuración de TLS/SSL requiere personalización, puede establecer la propiedad sslContext de su MongoClient pasando un objeto SSLContext al generador en la lambda applyToSslSettings():

SSLContext sslContext = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.context(sslContext);
})
.build();
MongoClient client = MongoClients.create(settings);

Si utilizas el controlador con Netty para IO de la red, existe la opción de añadir una implementación alternativa del protocolo TLS/SSL proporcionada por Netty.

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

El controlador prueba con la versión Netty io.netty:netty-all:4.1.87.Final

Para instruir al driver para que utilice io.netty.handler.ssl.SslContext, configura NettyTransportSettings cuando defina sus MongoClientSettings. Usar MongoClientSettings.Builder.transportSettings y NettyTransportSettings.Builder.sslContext para compilar sus configuraciones:

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 sobre io.netty.handler.ssl.SslProvider, consulta la documentación de Netty

OCSP es un estándar utilizado para verificar si los certificados X.509 han sido revocados. Una autoridad de certificación puede agregar un certificado X.509 a la Lista de revocación de certificados (CRL) antes de que venza el plazo para invalidar el certificado. Cuando un cliente envía un certificado X.509 durante el apretón de manos TLS, el servidor de revocación de la CA verifica la CRL y devuelve un estado de "bueno", "revocado" o "desconocido".

El controlador admite las siguientes variaciones de OCSP:

  • OCSP impulsado por el cliente

  • OCSP incorporar

Las siguientes secciones describen las diferencias entre ellas y cómo habilitarlas para su aplicación.

Nota

El controlador Java utiliza los argumentos JVM configurados para la aplicación y no pueden sobrescribirse para una instancia específica de MongoClient.

En el OCSP impulsado por el cliente, el cliente envía el certificado en una solicitud OCSP a un respondedor OCSP después de recibir el certificado del servidor. El respondedOR OCSP verifica el estado del certificado con una autoridad certificadora (CA) y reporta si es válido en una respuesta enviada al cliente.

Para habilitar OCSP controlado por el cliente para su aplicación, configure las siguientes propiedades del sistema JVM:

Propiedad
Valor

com.sun.net.ssl.checkRevocation

Establezca esta propiedad en true para habilitar la verificación de revocación.

ocsp.enable

Establezca esta propiedad en true para habilitar OCSP controlado por el cliente.

Advertencia

Si el respondedor OCSP no está disponible, la compatibilidad con TLS del JDK informa un fallo grave. Esto difiere del comportamiento de fallo leve de MongoDB Shell y otros controladores.

El grapado OCSP es un mecanismo en el cual el servidor debe obtener el certificado firmado de la autoridad de certificación (CA) e incluirlo en una respuesta OCSP con marca de tiempo al cliente.

Para activar el OCSP incorporar para su aplicación, establezca las siguientes propiedades del sistema JVM:

Propiedad
Descripción

com.sun.net.ssl.checkRevocation

Establezca esta propiedad en true para habilitar la verificación de revocación.

jdk.tls.client.enableStatusRequestExtension

Set this property to true to enable OCSP stapling.

If unset or set to false, the connection can proceed regardless of the presence or status of the certificate revocation response.

Para obtener más información sobre OCSP, consulta los siguientes recursos:

Volver

Encriptación en uso