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, 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.

Se puede habilitar TLS/SSL para la conexión con la instancia de MongoDB de dos formas diferentes: mediante un parámetro en la cadena de conexión, o usando un método en el MongoClientSettings.Builder clase.

Nota

El protocolo de lista de semillas DNS habilita TLS

Si te conectas mediante el protocolo DNS lista de nodos iniciales, indicado por el prefijo mongodb+srv en tu cadena de conexión, el driver habilita automáticamente TLS/SSL. Para deshabilitarlo, establece el valor del parámetro tls en false en tu cadena de conexión, o establece la propiedad enabled en false en el bloque SslSettings.Builder al crear una instancia de 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 MongoClient.create():

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

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

val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString("<connection string>"))
.applyToSslSettings { builder ->
builder.enabled(true)
}
.build()
val mongoClient = MongoClient.create(settings)

Nota

Depuración de TLS/SSL

Si experimenta problemas al configurar su conexión TLS/SSL, puede usar la propiedad del sistema -Djavax.net.debug=all para ver más instrucciones de registro. Consulte la guía de Oracle para la depuración de conexiones TLS/SSL para obtener más información.

Las aplicaciones Kotlin que inician solicitudes TLS/SSL requieren acceso a certificados criptográficos que acreditan la identidad de la propia aplicación y de otras aplicaciones con las que interactúa. Puede configurar el acceso a estos certificados en su 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 están basadas en la documentación de Oracle JDK, por lo que algunas partes pueden no ser aplicables a tu JDK o a la implementación personalizada de TLS/SSL que utilices.

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 JVM guarda los certificados que identifican de manera segura a otras aplicaciones con las que tu aplicación de Kotlin interactúa. 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 JVM guarda los certificados que identifican de forma segura tu aplicación Kotlin ante otras aplicaciones. Utilizando estos certificados, otras aplicaciones pueden demostrar que la conexión a tu aplicación es genuina y segura contra manipulaciones por parte de terceros.

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 al servidor 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 Kotlin para usar TLS/SSL, ver la Guía de referencia de 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():

val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString("<connection string>"))
.applyToSslSettings { builder ->
builder.enabled(true)
builder.invalidHostNameAllowed(true)
}
.build()
val mongoClient = MongoClient.create(settings);

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.

Incluye las siguientes instrucciones de importación:

import com.mongodb.MongoClientSettings
import com.mongodb.connection.SslSettings
import com.mongodb.connection.TransportSettings
import com.mongodb.kotlin.client.coroutine.MongoClient
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:

val sslContext = SslContextBuilder.forClient()
.sslProvider(SslProvider.OPENSSL)
.build()
val settings = MongoClientSettings.builder()
.applyToSslSettings { builder: SslSettings.Builder -> builder.enabled(true) }
.transportSettings(
TransportSettings.nettyBuilder()
.sslContext(sslContext)
.build()
)
.build()
val mongoClient = MongoClient.create(settings);

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():

// You can customize SSL settings using the SSLContext
val sslContext = SSLContext.getDefault()
val settings = MongoClientSettings.builder()
.applyToSslSettings { builder ->
builder.enabled(true)
builder.context(sslContext)
}
.build()
val mongoClient = MongoClient.create(settings);

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 de Kotlin utiliza los argumentos JVM configurados para la aplicación y no pueden ser sobrescritos 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

Flujos de cambio