Overview
En esta guía, puedes aprender cómo conectarte 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 instrucciones de registro. Consulta la guía de Oracle para depurar conexiones TLS/SSL para obtener más información.
Habilitar TLS/SSL
Puedes habilitar TLS/SSL para la conexión a tu instancia de MongoDB de dos maneras diferentes: a través de un parámetro en tu cadena de conexión o usando un método en la clase MongoClientSettings.Builder.
Nota
Si te conectas utilizando el protocolo DNS lista de nodos iniciales, indicado por el prefijo mongodb+srv en tu cadena de conexión, el driver habilita TLS/SSL. Para deshabilitarlo, establezca el valor del parámetro tls o ssl a false en su cadena de conexión o instancia MongoClientSettings.
Para obtener más información sobre el comportamiento de conexión cuando se utiliza una lista de nodos iniciales DNS, consulte la sección SRV Connection Format 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 puedes incluir en tu cadena de conexión para modificar el comportamiento TSL del driver:
Nombre de la opción | Tipo | Descripción |
|---|---|---|
ssl | booleano |
|
tls | booleano |
|
tlsInsecure | booleano |
|
tlsAllowInvalidHostnames | booleano |
|
Para configurar las opciones de conexión TLS/SSL de MongoClient mediante la clase MongoClientSettings.Builder, encadena el método applyToSslSettings(). Establece la propiedad enabled en true en el bloque SslSettings.Builder para activar 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 |
|---|---|
| Usa los parámetros de un objeto |
| Utiliza la configuración TLS/SSL especificada en un objeto |
| Establece el |
| 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 demuestren la identidad tanto de la propia aplicación como de otras aplicaciones con las que interactúa la aplicación. Puedes configurar el acceso a estos certificados en tu aplicación mediante los siguientes mecanismos:
La tienda de confianza JVM y la tienda de claves JVM
Un almacén de confianza específico del cliente y un almacén de claves
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
Por defecto, el JRE incluye muchos certificados públicos comúnmente utilizados de autoridades de firma como Let's Encrypt. Como resultado, puedes conectarte a instancias de MongoDB Atlas (o cualquier otro servidor cuyo certificado esté firmado por una autoridad en el almacén de certificados por defecto 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 manera segura otras aplicaciones con las que interactúa tu aplicación Java. Al utilizar estos certificados, tú aplicación puede demostrar que la conexión con otra aplicación es legítima y está protegida contra la manipulación de terceros.
Si tu instancia de MongoDB utiliza un certificado firmado por una autoridad que no se encuentra en el almacén de certificados por defecto de JRE, tu aplicación debe configurar dos propiedades del sistema para iniciar las 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 una almacén de confianza que contiene el certificado de la autoridad firmantejavax.net.ssl.trustStorePassword: la contraseña para acceder al trust store definida enjavax.net.ssl.trustStore
Puedes 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>
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.
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 debe 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
Puedes crear una tienda de llaves 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, consulta la Guía de referencia 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 para el cliente mediante el método init() de la clase SSLContext.
Puedes encontrar un ejemplo de cómo configurar un cliente con una instancia de SSLContext en la Personalización de la configuración de TLS/SSL con una sección SSLContext de esta guía.
Para obtener más información sobre la clase SSLContext, consulta la documentación de la API para 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();
Advertencia
Desactivar la verificación del nombre de host puede hacer que tu configuración sea insegura. Desactive la verificación del nombre de host únicamente con fines de prueba o cuando no haya otra alternativa.
Restringir las conexiones a TLS 1.2 Solamente
Para restringir su aplicación a fin de utilizar únicamente el protocolo TLS 1.2, configure la propiedad del sistema jdk.tls.client.protocols en "TLSv1.2".
Nota
Las Entornos de Ejecución de Java (JRE) previos a Java 8 solo activaban el protocolo TLS 1.2 en las versiones de actualizar. Si tu JRE no ha activado el protocolo TLS 1.2, actualiza a una versión más reciente para conectarte utilizando TLS 1.2.
Personaliza la configuración TLS/SSL a través de Java SE SSLContext
Si su configuración de TLS/SSL requiere personalización, puede establecer la propiedad sslContext de su MongoClient pasando un objeto SSLContext al generador en la lambda applyToSslSettings():
SSLContext sslContext = ... MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(builder -> { builder.enabled(true); builder.context(sslContext); }) .build(); MongoClient client = MongoClients.create(settings);
Personalizar la configuración TLS/SSL a través de Netty SslContext
Si utilizas el controlador con Netty para IO de la red, existe la opción de añadir una implementación alternativa del protocolo TLS/SSL 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 sobre io.netty.handler.ssl.SslProvider, consulta la documentación de Netty
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 puede agregar un certificado X.509 a la Lista de revocación de certificados (CRL) antes de que venza el plazo para invalidar el certificado. Cuando un cliente envía un certificado X.509 durante el apretón de manos TLS, el servidor de revocación de la CA verifica la CRL y devuelve un estado de "bueno", "revocado" o "desconocido".
El controlador admite las siguientes variaciones de OCSP:
OCSP impulsado por el cliente
OCSP incorporar
Las siguientes secciones describen las diferencias entre ellas y cómo habilitarlas para su aplicación.
Nota
El controlador Java utiliza los argumentos JVM configurados para la aplicación y no pueden sobrescribirse para una instancia específica de MongoClient.
OCSP impulsado por el cliente
En el OCSP impulsado por el cliente, el cliente envía el certificado en una solicitud OCSP a un respondedor OCSP después de recibir el certificado del servidor. El respondedOR OCSP verifica el estado del certificado con una autoridad certificadora (CA) y reporta si es válido 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.
OCSP incorporar
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 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:
Oracle JDK 8 Documentación en cómo habilitar OCSP para una aplicación