Overview
En esta guía, puedes aprender cómo utilizar el Protocolo TLS para asegurar tu conexión a una implementación de MongoDB.
Cuando activas TLS para una conexión, el driver de C++ realiza las siguientes acciones:
Utiliza TLS para conectarse a la implementación de MongoDB
Verifica el certificado de la implementación
Garantiza 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 asume conocimientos previos de TLS/SSL y acceso a certificados válidos. Una descripción completa de TLS/SSL, certificados PKI (infraestructura de llave pública) y Autoridades Certificadoras (CA) está 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.
Habilitar TLS
Para habilitar TLS para la conexión a tu instancia de MongoDB, establece el 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 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.
Specify a CA File
Durante el handshake TLS, la implementación de MongoDB presenta a tu aplicación un archivo clave de certificado para establecer su identidad. Por lo general, el certificado de una implementación ha sido firmado por una CA conocida, y tu aplicación depende de esta CA para validar el certificado.
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.
Especificar un directorio de CA
Si utilizas OpenSSL o LibreSSL (libtls) para soporte con TLS, también puedes indicar al controlador C++ que busque un archivo CA dentro de un directorio. El driver buscará 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.
Comprobar revocación de certificado
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.
OCSP
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 adjunta una respuesta OCSP con sello de tiempo a su certificado. El controlador C++ valida el certificado frente a la respuesta OCSP. Si la CA ha revocado el certificado, o si la respuesta OCSP es inválida, el apretón de manos TLS falla.
MongoDB v4.3 o anterior: El servidor proporciona un endpoint OCSP, con el que el driver C++ contacta directamente. A continuación, el controlador de C++ valida el certificado según la respuesta OCSP. Si la Autoridad de Certificación no ha revocado el certificado, el apretón de manos TLS continúa, incluso si la respuesta OCSP es inválida o está malformada.
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");
Lista de revocación de certificados
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.
Presentar un certificado de cliente
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.
Puedes hacer esto de dos maneras: configurando una propiedad en un objeto mongocxx::options::tls, o a través del parámetro tlsCertificateKeyFile en tu cadena de conexión.
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
Proporcione una contraseña clave
Si la clave privada de tu archivo de certificado está cifrada, debes proporcionar la contraseña. Puedes hacer esto de dos maneras: configurando una propiedad en un objeto mongocxx::options::tls o utilizando el parámetro tlsCertificateKeyFilePassword en tu cadena de conexión.
Permitir TLS no seguro
Cuando TLS está habilitado, el controlador de C++ verifica automáticamente el certificado que presenta el servidor. Cuando pruebe su código, puede deshabilitar esta verificación. Esto se conoce como TLS no seguro.
Cuando se habilita TLS no seguro, el controlador requiere solamente que el servidor presente un certificado X.509. El controlador acepta un certificado incluso si se da alguna de las siguientes situaciones:
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 todavía 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 de certificados, configura la opción tlsAllowInvalidCertificates en true y la opción tlsInsecure en false (o déjala sin configurar):
Para deshabilitar únicamente 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
Siempre establece 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 tu aplicación sea insegura y potencialmente vulnerable a certificados expirados y a procesos externos que se hacen pasar por instancias válidas de clientes.
Documentación de la API
Para obtener más información sobre cómo configurar TLS para el controlador C++, consulte la siguiente documentación de API: