Overview
En esta guía, puede aprender cómo conectarse a instancias de MongoDB con el TLS/SSLProtocolo de seguridad que utiliza la compatibilidad subyacente TLS/SSL en el JDK. Para configurar su conexión para que use TLS/SSL, habilite la configuración de TLS/SSL en ConnectionString o MongoClientSettings.
Nota
Depuración de TLS/SSL
Si tiene problemas para configurar su conexión TLS/SSL, puede utilizar el -Djavax.net.debug=all Propiedad del sistema para ver más declaraciones de registro.Consulte la guía de Oracle para depurar conexiones TLS/SSL para obtener más información.
Habilitar TLS/SSL
Puede habilitar TLS/SSL para la conexión a su instancia de MongoDB de dos maneras diferentes: a través de un parámetro en su cadena de conexión o utilizando un método en la clase MongoClientSettings.Builder.
Nota
Si se conecta mediante el protocolo de lista de semillas DNS, indicado por el prefijo mongodb+srv en su cadena de conexión, el controlador habilita TLS/SSL. Para deshabilitarlo, configure el valor del parámetro tls o ssl en false en su cadena de conexión o instancia MongoClientSettings.
Para obtener más información sobre el comportamiento de la conexión cuando utiliza una lista de semillas DNS, consulte la sección Formato de conexión SRV 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 MongoClients.create():
MongoClient mongoClient = MongoClients.create("mongodb+srv://<db_username>:<db_password>@<cluster-url>?tls=true");
La siguiente tabla describe el parámetro que puede incluir en su cadena de conexión para modificar el comportamiento TSL del controlador:
Nombre de la opción | Tipo | Descripción |
|---|---|---|
ssl | booleano |
|
tls | booleano |
|
tlsInsecure | booleano |
|
tlsPermitir nombres de host no válidos | booleano |
|
Para configurar las MongoClient opciones de conexión TLS/SSL de su mediante la MongoClientSettings.Builder clase, encadene el método applyToSslSettings(). Establezca la enabled propiedad en true en el SslSettings.Builder bloque para habilitar TLS/SSL:
MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder().applyConnectionString(new ConnectionString("<your connection string>")) .applyToSslSettings(builder -> builder.enabled(true)) .build());
La siguiente tabla describe los métodos que puede encadenar a su configuración para modificar el comportamiento TSL del controlador:
Método | Descripción |
|---|---|
| Utiliza la configuración de un objeto |
| Utiliza la configuración TLS/SSL especificada en un objeto |
| Establece |
| Si se debe habilitar TLS/SSL. (Debe habilitar esto para los clústeres de Atlas). |
| Determina si se permite una discrepancia entre el nombre de host del servidor y el nombre de host especificado por el certificado TLS. |
Configurar certificados
Las aplicaciones Java 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:
El almacén de confianza de JVM y el almacén de claves de JVM
Un almacén de confianza y un almacén de claves específicos del cliente
Nota
Las siguientes secciones se basan en la documentación de Oracle JDK, por lo que es posible que algunas no se apliquen a su JDK o a su implementación de TLS/SSL personalizada.
Configurar el almacén de confianza de JVM
Nota
De forma predeterminada, el JRE incluye muchos certificados públicos de uso común de autoridades de firma como Let's Encrypt. Como resultado, puede conectarse a instancias de MongoDB Atlas (o a cualquier otro servidor cuyo certificado esté firmado por una autoridad del almacén de certificados predeterminado del JRE) con TLS/SSL sin configurar el almacén de confianza.
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 Java. Con estos certificados, su aplicación puede demostrar que la conexión con otra aplicación es genuina y segura contra manipulaciones externas.
Si su instancia de MongoDB utiliza un certificado firmado por una autoridad que no está presente en el almacén de certificados predeterminado de JRE, su aplicación debe configurar dos propiedades del sistema para iniciar 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 un almacén de confianza que contiene el certificado de la autoridad firmantejavax.net.ssl.trustStorePassword:la contraseña para acceder al almacén de confianza definido enjavax.net.ssl.trustStore
Puede 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>
Configurar el almacén de claves de JVM
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.
El almacén de claves de la JVM guarda certificados que identifican de forma segura su aplicación Java ante otras aplicaciones. Con estos certificados, otras aplicaciones pueden demostrar que la conexión con su aplicación es genuina y segura contra manipulaciones externas.
Una aplicación que inicia solicitudes TLS/SSL necesita configurar dos propiedades del sistema JVM para garantizar que el cliente presente un certificado TLS/SSL a la implementación de 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 con la herramienta de línea de comandos keytool o openssl.
Para obtener más información sobre cómo configurar una aplicación Java para utilizar TLS/SSL, consulte la Guía de referencia de JSSE.
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 utilizando el método init() de la clase SSLContext.
Puede encontrar un ejemplo que muestra cómo configurar un cliente con una SSLContext instancia en la sección Personalizar la configuración TLS/SSL con un SSLContext de esta guía.
Para obtener más información sobre la SSLContext clase, consulte la documentación de la API para el contexto SSL.
Deshabilitar la verificación del nombre de host
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():
MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> { builder.enabled(true); builder.invalidHostNameAllowed(true); }) .build();
Restringir conexiones solo 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 8 a Java solo habilitaban el 1.2 protocolo TLS en versiones de actualización. Si su JRE no lo tiene 1.2 habilitado, actualice a una versión posterior para conectarse mediante TLS.1.2
Personalice la configuración de TLS/SSL a través de Java SE SSLContext
Si su configuración TLS/SSL requiere personalización, puede establecer la sslContext propiedad de su MongoClient pasando un objeto SSLContext al generador en la applyToSslSettings() lambda:
SSLContext sslContext = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> { builder.enabled(true); builder.context(sslContext); }) .build(); MongoClient client = MongoClients.create(settings);
Personalice la configuración de TLS/SSL a través de Netty SslContext
Si utiliza el controlador con Netty para E/S de red, tiene la opción de conectar una implementación de protocolo TLS/SSL alternativa proporcionada por Netty.
import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.SslProvider;
Nota
El controlador prueba con la versión Netty io.netty:netty-all:4.1.87.Final
Para instruir al driver para que utilice io.netty.handler.ssl.SslContext, configura NettyTransportSettings cuando defina sus MongoClientSettings. Usar MongoClientSettings.Builder.transportSettings y NettyTransportSettings.Builder.sslContext para compilar sus configuraciones:
SslContext sslContext = SslContextBuilder.forClient() .sslProvider(SslProvider.OPENSSL) .build(); MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> builder.enabled(true)) .transportSettings(TransportSettings.nettyBuilder() .sslContext(sslContext) .build()) .build(); MongoClient client = MongoClients.create(settings);
Para obtener más detalles io.netty.handler.ssl.SslProvider sobre, consulte la documentación de Netty
Protocolo de estado de certificado en línea (OCSP)
OCSP es un estándar utilizado para comprobar si los certificados X.509 han sido revocados. Una autoridad de certificación 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 "correcto", "revocado" o "desconocido".
El controlador admite las siguientes variaciones de OCSP:
OCSP impulsado por el cliente
Grapado OCSP
Las siguientes secciones describen las diferencias entre ellos y cómo habilitarlos para su aplicación.
Nota
El controlador Java utiliza los argumentos JVM configurados para la aplicación y no se puede anular para una instancia MongoClient específica.
OCSP impulsado por el cliente
En OCSP basado en el cliente, el cliente envía el certificado en una solicitud OCSP a un respondedor OCSP tras recibirlo del servidor. El respondedor OCSP comprueba el estado del certificado con una autoridad de certificación (CA) e informa de su validez 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 |
|---|---|
| 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.
Grapado OCSP
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 habilitar el grapado OCSP para su aplicación, configure 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, consulte los siguientes recursos:
Documentación de Oracle JDK 8 sobre cómo habilitar OCSP para una aplicación