Overview
En esta guía, puedes aprender cómo conectarte a instancias de MongoDB con el protocolo de seguridad TLS.
Para configurar tu conexión para usar TLS, habilita la opción TLS y proporciona tus certificados para la validación.
Tip
Para aprender más sobre TLS, consulte la entrada de Wikipedia sobre Seguridad de la capa de transporte.
Habilitar TLS
Puedes habilitar TLS en una conexión a tu instancia de MongoDB de las siguientes maneras:
Configurando el
tlsopción atrueen su objetoMongoClientOptionsEstablecer la opción
tlsentrueen tu cadena de conexión
Nota
Si usas un registro DNS SRV al conectarte a MongoDB especificando la modificación +srv en tu cadena de conexión, activas TLS en tu conexión por defecto. Para desactivarlo, establece el valor del parámetro tls o ssl en false en tu cadena de conexión u objeto MongoClientOptions.
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.
Nota
Solución para un error de "renegociación heredada insegura deshabilitada"
El controlador Node.js depende de OpenSSL por defecto. Los proxies SSL obsoletos pueden causar un error unsafe legacy renegotiation disabled en entornos que utilizan OpenSSL 3.0 o posterior. Puede resolver este error configurando la opción SSL_OP_LEGACY_SERVER_CONNECT, como se muestra en el siguiente ejemplo:
import { MongoClient } from 'mongodb'; import crypto from 'crypto'; const client = new MongoClient("mongodb+srv://...", { secureContext: { secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT } });
Además de la tls opción de cliente, el controlador ofrece más opciones para configurar TLS en su conexión. Para realizar pruebas, puede configurar tlsAllowInvalidHostnames tlsAllowInvalidCertificateslas tlsInsecure opciones de cliente, y.
Configurar la opción tlsAllowInvalidHostnames en true deshabilita la verificación del nombre de host, y configurar la opción tlsAllowInvalidCertificates en true deshabilita la validación del certificado. Configurar la opción tlsInsecure en true deshabilita tanto la validación del certificado como la del nombre de host.
Advertencia
Especificar cualquiera de estas opciones en un entorno de producción hace que tu aplicación sea insegura y potencialmente vulnerable a certificados caducados y a procesos externos que se hagan pasar por instancias de cliente válidas.
Para obtener una lista completa de las opciones del cliente, consulta Especificar opciones de conexión.
Configurar certificados
Para iniciar correctamente una solicitud TLS, una aplicación debe demostrar su identidad haciendo referencia a certificados criptográficos. Para conectarte a MongoDB con TLS, tus certificados deben almacenarse como archivos PEM.
Importante
Para el uso en producción, recomendamos que tu implementación de MongoDB use certificados válidos generados y firmados por la misma autoridad certificadora. Para pruebas, puedes utilizar certificados autofirmados.
La siguiente lista describe los componentes necesarios para establecer una conexión con TLS:
Componente TLS | Descripción |
|---|---|
Autoridad de certificación (CA) | Una o más autoridades de certificación en las que confiar al realizar una conexión TLS. |
Certificado de cliente | Un certificado digital y una clave que permiten al servidor verificar la identidad de su aplicación para establecer una conexión de red cifrada. |
Clave del certificado | El archivo de clave privada del certificado de cliente. Esta clave a menudo se incluye dentro del propio archivo de certificado. |
Frase de contraseña | La contraseña para descifrar la clave privada del cliente si está cifrada. |
Tip
Para obtener más información sobre el formato PEM, consulte la entrada de Wikipedia sobre correo con privacidad mejorada.
Certificados de referencia en un cliente
Debe referenciar sus certificados en su objeto MongoClientOptions para que el servidor pueda validarlos antes de que el cliente se conecte. Puedes hacer referencia a tus certificados de las siguientes maneras:
Crea un objeto
SecureContextpara almacenar certificados (Recomendado)Proporcione cadenas de ruta de archivo que apunten a sus certificados
Crear
Bufferobjetos para almacenar certificados
Crea un objeto SecureContext para almacenar los certificados
Recomendamos que utilice la opción secureContext para configurar la conexión TLS. Los objetos SecureContext son nativos de Node.js y permiten mantener todas las opciones TLS en un único objeto reutilizable.
Para crear un objeto SecureContext, importe el método createSecureContext() del módulo tls. A continuación, llame al método createSecureContext() y pase el contenido de sus certificados en el parámetro options. Este método devuelve un objeto SecureContext que puede usar en su objeto MongoClientOptions.
El siguiente código muestra cómo crear un objeto SecureContext y pasarlo a su cliente:
// Create a SecureContext object const secureContext = tls.createSecureContext({ ca: fs.readFileSync(`<path to CA certificate>`), cert: fs.readFileSync(`<path to public client certificate>`), key: fs.readFileSync(`<path to private client key>`), }); // Pass the SecureContext as a client option const client = new MongoClient(uri, { tls: true, secureContext });
Para obtener más información sobre el método createSecureContext() y el paquete tls, consulta la Documentación de la API TLS de Node.js.
Para un ejemplo ejecutable que utilice un objeto SecureContext, consulta el Ejemplo de SecureContext.
Proporcione las rutas de archivos de los certificados
Puede incluir las rutas de archivo de sus certificados como opciones de cliente para recuperarlos al conectarse con TLS. El controlador lee estos archivos al llamar al método connect() en su instancia MongoClient.
El siguiente código muestra cómo proporcionar rutas de archivos de certificados como opciones en su MongoClient:
// Pass filepaths as client options const client = new MongoClient(uri, { tls: true, tlsCAFile: `<path to CA certificate>`, tlsCertificateKeyFile: `<path to private client key>`, });
Nota
Archivos CRL
Tu configuración TLS podría requerir que presentes una lista de revocación de certificados (CRL) al conectarte a MongoDB. A partir de la versión 6.0 del driver, puedes proporcionar la ruta de archivo de tu archivo CRL en la opción tlsCRLFile de tu cadena de conexión o en tu instancia MongoClientOptions.
Crear objetos de búfer para almacenar certificados
Puede pasar el contenido de sus archivos de certificado como objetos Buffer en las opciones de su cliente para conectarse con TLS.
El siguiente código muestra cómo leer el contenido de los archivos del certificado y pasar los objetos resultantes de Buffer como opciones en tu MongoClient:
// Read file contents const ca = fs.readFileSync(`<path to CA certificate>`); const cert = fs.readFileSync(`<path to public client certificate>`); const key = fs.readFileSync(`<path to private client key>`); // Pass Buffers as client options const client = new MongoClient(uri, { tls: true, ca, cert, key });
Ejemplo de SecureContext
Este ejemplo muestra cómo crear un objeto SecureContext y una instancia MongoClient que incluya opciones de TLS. El ejemplo se conecta a MongoDB y ejecuta una query:
import { MongoClient } from "mongodb"; import * as fs from "fs"; import * as tls from "tls"; // Replace the uri string with your connection string. const uri = "<connection uri>"; // Replace the filepaths with your certificate filepaths. const secureContext = tls.createSecureContext({ ca: fs.readFileSync(`<path to CA certificate>`), cert: fs.readFileSync(`<path to public client certificate>`), key: fs.readFileSync(`<path to private client key>`), }); // Create a client with the secureContext option const client = new MongoClient(uri, { tls: true, secureContext }); async function run() { try { const db = client.db("myDB"); const myColl = db.collection("myColl"); const doc = await myColl.findOne({}); console.log(doc); } finally { await client.close(); } } run().catch(console.dir);
Información Adicional
Para obtener más información sobre cómo habilitar TLS en una conexión, consulte la siguiente documentación del manual del servidor: