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

Configurar la Seguridad de la Capa de Transporte (TLS)

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.

Nota

Esta página presupone conocimientos previos de TLS/SSL y acceso a certificados válidos. Una descripción completa de TLS/SSL, certificados PKI (Infraestructura de Clave Pública) y Autoridades de Certificación (CA) queda fuera del alcance de esta documentación. Para obtener más información sobre TLS, consulte la entrada de Wikipedia sobre Seguridad de la capa de transporte.

Cuando se habilita TLS para una conexión, el controlador Scala realiza las siguientes acciones:

  • Utiliza TLS para conectarse a la implementación de MongoDB

  • Verifica el certificado de la implementación

Para saber cómo configurar su implementación de MongoDB para TLS, consulte la guía de configuración de TLS en el manual de MongoDB Server.

Por defecto, el driver admite conexiones TLS/SSL con los servidores de MongoDB, utilizando el soporte de TLS/SSL subyacente proporcionado por el JDK. Esto se puede cambiar mediante el API de Netty o la extensibilidad del API 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.

Puede habilitar TLS para la conexión a su implementación de MongoDB de las siguientes maneras:

  • Usa el enabled() método de la clase SslSettings.Builder al crear una instancia de MongoClientSettings

  • Establece el parámetro tls en tu URI de conexión

Selecciona el MongoClientSettings o la pestaña Connection URI para ver el código correspondiente que habilita TLS:

val tlsUri = "mongodb://localhost:27017/"
val tlsSettings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(tlsUri))
.applyToSslSettings(builder => builder.enabled(true))
.build()
val tlsClient1 = MongoClient(tlsSettings)
val tlsClient2 = MongoClient("mongodb://localhost:27017/?tls=true")

Tip

Si tu cadena de conexión incluye la modificación +srv, que especifica el formato de conexión SRV, TLS está habilitado en tu conexión por defecto.

Para obtener más información sobre el formato de conexión SRV, consulta Formato de conexión SRV en la documentación de MongoDB Server.

Nota

Las instrucciones en estas secciones se basan en la documentación de Oracle JDK. Es posible que no se apliquen a tu JDK o a tu implementación personalizada de TLS/SSL.

Las aplicaciones Scala que inician solicitudes TLS requieren acceso a certificados criptográficos que acreditan la identidad de la aplicación y verifican otras aplicaciones con las que interactúa. Puede configurar el acceso a estos certificados en su aplicación de las siguientes maneras:

  • Usa un almacén de confianza JVM y un almacén de claves JVM

  • Utiliza un almacén de confianza y un almacén de claves específicos del cliente

El almacén de confianza de la JVM guarda certificados que identifican de forma segura otras aplicaciones con las que interactúa la aplicación Scala. Al utilizar estos certificados, tu aplicación puede demostrar que la conexión con otra aplicación es auténtica y está protegida contra manipulaciones de terceros.

El Entorno de Ejecución de Java (JRE) proporciona un almacén de certificados por defecto, que incluye certificados públicos comúnmente empleados de autoridades firmantes. Si la implementación de MongoDB utiliza un certificado firmado por una autoridad que no está presente en el almacén de certificados predeterminado de la JRE, su aplicación debe configurar las siguientes propiedades del sistema para iniciar solicitudes TLS:

  • javax.net.ssl.trustStoreLa ruta a un almacén de confianza que contiene el certificado de la autoridad de firma

  • javax.net.ssl.trustStorePasswordLa contraseña para acceso al 'almacén de confianza' definida por la propiedad javax.net.ssl.trustStore

Puedes usar la herramienta de línea de comandos keytool para definir las propiedades anteriores. El siguiente ejemplo ejecuta el comando keytool para especificar la ruta del archivo de la autoridad certificadora, la ruta del almacén de confianza y la contraseña del almacén de confianza:

keytool -importcert -trustcacerts -file <path to certificate authority file>
-keystore <path to trust store> -storepass <trust store 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.

Una aplicación que inicia solicitudes TLS debe configurar las siguientes propiedades del sistema JVM para garantizar que el cliente presente un certificado TLS al servidor 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

Puede crear un almacén de claves utilizando la keytool o la herramienta de línea de comandos de openssl.

Para obtener más información sobre cómo configurar una aplicación Scala para usar TLS, consulta la Guía de referencia de JSSE en la documentación del lenguaje Java.

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

Para consultar un ejemplo sobre cómo configurar un cliente para usar una instancia de SSLContext, ve a la sección Personalizar configuración con SSLContext de esta guía.

Por defecto, el controlador garantiza que el nombre de host incluido en los certificados TLS del servidor coincida con los nombres de host proporcionados al construir un MongoClient. Puedes desactivar la verificación del nombre de host de las siguientes maneras:

  • Utiliza el método invalidHostNameAllowed() de la clase SslSettings.Builder al crear una instancia de MongoClientSettings.

  • Establece el parámetro tlsAllowInvalidHostnames en tu URI de conexión

Seleccione la pestaña MongoClientSettings o Connection URI para ver el código correspondiente que deshabilita la verificación del nombre de host:

val invalidHostUri = "mongodb://localhost:27017/"
val invalidHostSettings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(invalidHostUri))
.applyToSslSettings(builder => builder
.enabled(true)
.invalidHostNameAllowed(true)
)
.build()
val invalidHostClient1 = MongoClient(invalidHostSettings)
val invalidHostClient2 = MongoClient("mongodb://localhost:27017/?tls=true&tlsAllowInvalidHostnames=true")

Advertencia

Deshabilitar la verificación del nombre de host hace que su aplicación sea insegura y potencialmente vulnerable a certificados vencidos y procesos externos que se hacen pasar por instancias de cliente válidas.

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

Nota

Los entornos de ejecución de Java (JRE) anteriores a Java 8 solo habilitaban el protocolo TLS 1.2 en las versiones de actualización. Si su JRE no tiene habilitado el protocolo TLS 1.2, actualice a una versión posterior para usar TLS 1.2.

Incluye las siguientes instrucciones de importación:

import io.netty.handler.ssl.SslContextBuilder
import io.netty.handler.ssl.SslProvider
import org.mongodb.scala.connection.TransportSettings

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 nettySettings = MongoClientSettings.builder()
.applyToSslSettings {
builder => builder.enabled(true)
}
.transportSettings(
TransportSettings.nettyBuilder()
.sslContext(sslContext)
.build()
)
.build()
val mongoClient = MongoClient(nettySettings);

Si su configuración de TLS requiere personalización, puede establecer la propiedad sslContext de su objeto MongoClient. Pase un objeto SSLContext al constructor de método context() en el bloque applyToSslSettings(), como se muestra en el siguiente código:

val sslContext = SSLContext.getDefault()
val contextSettings = MongoClientSettings.builder()
.applyToSslSettings(builder => builder
.enabled(true)
.context(sslContext)
)
.build()
val mongoClient = MongoClient(contextSettings);

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

OCSP es un estándar utilizado para comprobar si los certificados X.509 han sido revocados. Una autoridad de certificación (CA) puede añadir un certificado X.509 a la Lista de Revocación de Certificados (CRL) antes de su fecha de caducidad para invalidarlo. Cuando un cliente envía un certificado X.509 durante el protocolo de enlace TLS, el servidor de revocación de la CA comprueba la CRL y devuelve un estado de good, revoked o unknown.

El controlador admite las siguientes variaciones de OCSP:

  • OCSP impulsado por el cliente

  • OCSP incorporar

Las siguientes secciones describen estas variaciones y muestran cómo habilitarlas para tu aplicación.

Nota

El controlador de Scala utiliza los argumentos de la JVM configurados para la aplicación, los cuales no se pueden sobrescribir para una instancia específica de MongoClient.

En el OCSP impulsado por el cliente, el cliente recibe el certificado del servidor y lo envía en una solicitud OCSP a un respondedor OCSP. El respondedor OCSP verifica el estado del certificado con una CA y envía un informe sobre su validez al cliente.

Para habilitar OCSP controlado por el cliente para su aplicación, configure 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.

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.

OCSP incorporar es un mecanismo en el cual el servidor debe obtener el certificado firmado de la CA e incluirlo en una respuesta OCSP con sello de tiempo para el 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:

Para obtener más información sobre cualquiera de los tipos discutidos en esta guía, consulta la siguiente documentación de la API:

Volver

Limitar el tiempo de ejecución