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 asume un conocimiento previo de TLS/SSL y el acceso a certificados válidos. Una descripción completa de los certificados TLS/SSL, PKI (Infraestructura de Llave Pública) y Autoridades Certificadoras (CA) supera el alcance de esta documentación. Para obtener más información sobre TLS, consulta la entrada de Wikipedia para 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 el 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 prueben la identidad de la aplicación y verifiquen otras aplicaciones con las que la aplicación Scala interactúa. Se puede configurar el acceso a estos certificados en la 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
Configura el almacén de confianza de la 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 inicie 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 definida 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.
Configura un almacén de confianza y un almacén de claves específico para el cliente
Puede configurar un almacén de confianza y un almacén de claves específicos del cliente utilizando 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.
Desactivar 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
Desactivar la verificación del nombre del host hace que tu aplicación sea insegura y potencialmente vulnerable a certificados caducados y procesos foráneos que se hacen pasar por instancias válidas del cliente.
Restringir conexiones a TLS 1.2
Para restringir tu aplicación a usar solo el protocolo TLS 1.2, configura la propiedad del sistema jdk.tls.client.protocols a "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 tu JRE no ha habilitado el protocolo TLS 1.2, actualiza 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
Las pruebas del controlador con la versión del paquete Netty io.netty:netty-all:4.1.87.Final
Para indicar al driver que utilice io.netty.handler.ssl.SslContext, configure NettyTransportSettings al definir el MongoClientSettings.
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 verificar 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 la expiración para invalidar el certificado. Cuando un cliente envía un certificado X.509 durante el protocolo de enlace TLS, el servidor de revocación del 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 tu aplicación, establece las siguientes propiedades del sistema JVM:
Propiedad | Descripción |
|---|---|
| Establezca esta propiedad en |
| Configura esta propiedad en |
Advertencia
Si el respondedor OSCP no está disponible, el soporte TLS proporcionado por el JDK informa un "fallo grave". Esto difiere del comportamiento de "error suave" del MongoDB Shell y de algunos otros drivers.
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: