Overview
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.
Habilitar TLS
Puede habilitar TLS para la conexión a su implementación de MongoDB de las siguientes maneras:
Usa el
enabled()método de la claseSslSettings.Builderal crear una instancia deMongoClientSettingsEstablece el parámetro
tlsen 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.
Configurar certificados
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
Configurar el almacén de confianza de JVM
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 firmajavax.net.ssl.trustStorePasswordLa contraseña para acceso al 'almacén de confianza' definida por la propiedadjavax.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>
Configura el almacén de claves JVM
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 clientejavax.net.ssl.keyStorePassword:La contraseña para acceder al almacén de claves definido enjavax.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.
Configurar un almacén de confianza y un almacén de claves específicos del cliente
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.
Deshabilitar la verificación del nombre de host
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 claseSslSettings.Builderal crear una instancia deMongoClientSettings.Establece el parámetro
tlsAllowInvalidHostnamesen 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.
Restringir conexiones a TLS 1.2
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.
Configurar TLS/SSL mediante Netty SslContext
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);
Personalizar la configuración con SSLContext
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.
Online Certificate Status protocolo (OCSP)
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.
OCSP impulsado por el cliente
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 |
|---|---|
| Establezca esta propiedad en |
| Establezca esta propiedad en |
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
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 |
|---|---|
| Establezca esta propiedad en |
| 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:
OCSP impulsado por el cliente y OCSP incorporar en la documentación de Oracle JDK 8
Documentación de la API
Para obtener más información sobre cualquiera de los tipos discutidos en esta guía, consulta la siguiente documentación de la API: