Docs Menu
Docs Home
/ /

Configurar la Seguridad de la Capa de Transporte (TLS)

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.

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

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.

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

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

  • Establezca el parámetro tls en su URI de conexión

Seleccione 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 su cadena de conexión incluye la modificación +srv, que especifica el formato de conexión SRV, TLS estará habilitado en su conexión de manera predeterminada.

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

Nota

Las instrucciones de estas secciones se basan en la documentación de Oracle JDK. Es posible que no sean aplicables a su JDK ni a su 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

  • Utilice 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 su aplicación Scala. Al usar estos certificados, su aplicación puede demostrar que la conexión con otra aplicación es genuina y segura contra manipulaciones externas.

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

  • javax.net.ssl.trustStore:La ruta a un almacén de confianza que contiene el certificado de la autoridad firmante

  • javax.net.ssl.trustStorePassword:La contraseña para acceder al almacén de confianza definido por la propiedad javax.net.ssl.trustStore

Puede usar la herramienta de línea de comandos keytool para definir las propiedades anteriores. El siguiente ejemplo ejecuta el keytool comando para especificar la ruta del archivo de la autoridad de certificación, 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

De forma predeterminada, las instancias de MongoDB no validan los certificados de cliente. Debe configurar el almacén de claves si configuró su instancia de MongoDB para validar 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 herramienta de línea de comandos keytool o 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.

De forma predeterminada, 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. Puede deshabilitar la verificación del nombre de host de las siguientes maneras:

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

  • Establezca el parámetro tlsAllowInvalidHostnames en su 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.

Incluya las siguientes declaraciones 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.

Utilice MongoClientSettings.Builder.transportSettings() y NettyTransportSettings.Builder.sslContext() para crear su 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 TLS requiere personalización, puede establecer la propiedad sslContext de su objeto MongoClient. Pase un objeto SSLContext al generador de métodos 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 SSLContext clase, consulte la documentación de la API para el 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

  • Grapado OCSP

Las siguientes secciones describen estas variaciones y muestran cómo habilitarlas para su 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 OCSP basado en el cliente, el cliente recibe el certificado del servidor y lo envía en una solicitud OCSP a un respondedor OCSP. Este respondedor 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.

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

Para habilitar el grapado OCSP 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.

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, consulte los siguientes recursos:

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

Volver

Limitar el tiempo de ejecución