Docs Menu
Docs Home
/ /

Configurar la Seguridad de la Capa de Transporte (TLS)

En esta guía, podrá aprender a utilizar el ProtocoloTLS para proteger su conexión a una implementación de MongoDB.

Cuando habilita TLS para una conexión, el controlador C++ realiza las siguientes acciones:

  • Utiliza TLS para conectarse a la implementación de MongoDB

  • Verifica el certificado de la implementación

  • Asegura que el certificado certifique 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.

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.

Tip

El controlador C++ delega la mayor parte del comportamiento de TLS al controlador C de MongoDB. Para obtener información sobre cómo el controlador C gestiona TLS, incluidos los pasos de configuración y el comportamiento esperado,consulte "Configuración de TLS" en la documentación del controlador C.

Para habilitar TLS para la conexión a su instancia de MongoDB, configure la tls opción de conexión a true en su cadena de conexión, como se muestra en el siguiente ejemplo:

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");

Tip

Si su cadena de conexión incluye la modificación +srv, que especifica el formato de conexión SRV, TLS estará habilitado en su conexión de manera predeterminada.

Para obtener más información sobre el formato de conexión SRV, consulte Formato de conexión SRV en la documentación de MongoDB Server.

Durante el protocolo de enlace TLS, la implementación de MongoDB presenta un archivo de clave de certificado a su aplicación para establecer su identidad. Normalmente, el certificado de una implementación ha sido firmado por una CA reconocida, y su aplicación depende de esta CA para validarlo.

Sin embargo, durante las pruebas, podría querer actuar como su propia CA. En este caso, debe indicar al controlador de C++ que use sus certificados de CA en lugar de los firmados por otra CA.

Para ello, especifique la ruta a un archivo .pem que contenga la cadena del certificado raíz. Puede hacerlo de dos maneras: estableciendo una propiedad en un objeto mongocxx::options::tls o usando el parámetro tlsCAFile en su cadena de conexión.

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.pem_file("/path/to/file.pem");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCAFile=/path/to/file.pem");

Si utiliza OpenSSL o LibreSSL (libtls) para compatibilidad con TLS, también puede indicar al controlador de C++ que busque un archivo CA en un directorio. El controlador busca en este directorio si no encuentra un archivo CA en la ruta especificada en la opción tlsCAFile o pem_file.

El siguiente ejemplo de código muestra cómo utilizar la opción ca_dir para especificar el directorio que el controlador debe buscar:

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_dir("/path/to/search/");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);

Tip

Esta opción corresponde al parámetro SSL_CTX_load_verify_locations en OpenSSL y al parámetro tls_config_set_ca_path en LibreSSL.

Cuando un certificado X.509 deja de ser confiable (por ejemplo, si su clave privada se ha visto comprometida), la CA lo revoca. El controlador de C++ incluye dos maneras de comprobar si el certificado de un servidor ha sido revocado.

El proceso del Protocolo de estado de certificado en línea (OCSP) varía según la versión de MongoDB Server a la que se esté conectando:

  • MongoDB v4.4 o posterior: El servidor envía una respuesta OCSP con marca de tiempo a su certificado. El controlador de C++ valida el certificado con la respuesta OCSP. Si la CA ha revocado el certificado o si la respuesta OCSP no es válida por cualquier otro motivo, el protocolo de enlace TLS falla.

  • MongoDB v4.3 o anterior: El servidor proporciona un punto final OCSP, al que el controlador C++ contacta directamente. El controlador C++ valida el certificado con la respuesta OCSP. Si la CA no ha revocado el certificado, el protocolo de enlace TLS continúa, incluso si la respuesta OCSP no es válida o tiene un formato incorrecto.

Para evitar que el controlador C++ se comunique con el punto final OCSP, configure la opción de conexión tlsDisableOCSPEndpointCheck en true en su cadena de conexión, como se muestra en el siguiente ejemplo de código:

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsDisableOCSPEndpointCheck=true");

En lugar de utilizar OCSP, puede indicarle al controlador C++ que verifique el certificado del servidor con una Lista de revocación de certificados (CRL) publicada por la CA.

El siguiente ejemplo de código muestra cómo utilizar la opción crl_file para especificar la ruta a un archivo .pem desde la CA:

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.crl_file("/path/to/file.pem");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);

Tip

Puede especificar un archivo CRL en formato .pem o .der.

Algunas implementaciones de MongoDB requieren que cada aplicación que se conecta presente un certificado de cliente que acredite su identidad. Para especificar el certificado de cliente que el controlador de C++ debe presentar, especifique la ruta del archivo .pem que contiene su certificado y clave privada.

Puede hacerlo de dos maneras: estableciendo una propiedad en un objeto mongocxx::options::tls o utilizando el parámetro tlsCertificateKeyFile en su cadena de conexión.

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.pem_file("/path/to/file.pem");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem");

Importante

Su certificado de cliente y su clave privada deben estar en el mismo archivo .pem. Si están almacenados en archivos diferentes, debe concatenarlos. El siguiente ejemplo muestra cómo concatenar un archivo de clave y un archivo de certificado en un tercer archivo llamado combined.pem en un sistema Unix:

$ cat key.pem cert.pem > combined.pem

Si la clave privada de su certificado está cifrada, debe proporcionar la contraseña. Puede hacerlo de dos maneras: estableciendo una propiedad en un objeto mongocxx::options::tls o usando el parámetro tlsCertificateKeyFilePassword en su cadena de conexión.

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.pem_file("/path/to/file.pem");
tls_options.pem_password("<password>");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem&tlsCertificateKeyFilePassword=<password>");

Cuando TLS está habilitado, el controlador de C++ verifica automáticamente el certificado que presenta el servidor. Al probar su código, puede deshabilitar esta verificación. Esto se conoce como TLS inseguro.

Cuando se habilita TLS inseguro, el controlador solo requiere que el servidor presente un certificado X.509. El controlador acepta un certificado incluso si se cumple alguna de las siguientes condiciones:

  • El nombre de host del servidor y el nombre del sujeto (o nombre alternativo del sujeto) en el certificado no coinciden.

  • El certificado está caducado o aún no es válido.

  • El certificado no tiene un certificado raíz confiable en la cadena.

  • El propósito del certificado no es válido para la identificación del servidor.

Nota

Incluso cuando está habilitado TLS inseguro, la comunicación entre el cliente y el servidor está cifrada con TLS.

Para habilitar TLS inseguro, configure la opción de conexión tlsInsecure en true en su cadena de conexión, como se muestra en el siguiente ejemplo de código:

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true");

Para deshabilitar solo la validación del certificado, configure la opción tlsAllowInvalidCertificates en true y configure la opción tlsInsecure en false (o omítala):

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.allow_invalid_certificates(true);
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidCertificates=true");

Para deshabilitar solo la verificación del nombre de host, configure la opción tlsAllowInvalidHostnames en true y configure la opción tlsInsecure en false (o omítala):

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidHostnames=true");

Advertencia

No utilizar en producción

Establezca siempre las opciones tlsInsecure, tlsAllowInvalidCertificates y tlsAllowInvalidHostnames en false en producción.

Establecer cualquiera de estas opciones en true en un entorno de producción hace que su aplicación sea insegura y potencialmente vulnerable a certificados vencidos y a procesos externos que se hacen pasar por instancias de cliente válidas.

Para obtener más información sobre cómo configurar TLS para el controlador C++, consulte la siguiente documentación de API:

Volver

Especifica opciones de conexión

En esta página