Overview
En esta guía, podrás aprender a utilizar el protocolo TLS para asegurar tu conexión a una implementación de MongoDB.
Cuando habilitas TLS para una conexión, el driver 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
Una descripción completa de las certificaciones TLS/SSL, PKI (infraestructura de llave pública) y las autoridades de certificación (CA) está más allá del alcance de este documento. Esta página asume conocimientos previos sobre TLS/SSL y acceso a certificados válidos.
Habilitar TLS
Puedes habilitar TLS en una conexión a tu instancia de MongoDB de las siguientes maneras:
Configurar el parámetro
tlsen su cadena de conexiónUsar la función
mongoc_uri_set_option_as_bool()para establecer la opción de conexiónMONGOC_URI_TLSentrue
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.
Especificar un certificado de cliente
Cuando te conectas a una implementación de MongoDB con TLS habilitado, la implementación requerirá por defecto que el cliente proporcione un certificado de cliente emitido por una autoridad certificadora, o una autoridad de confianza del almacén de certificados nativo utilizado en el servidor.
Puede proporcionar el certificado de cliente de las siguientes maneras:
Establecer el parámetro
tlsCertificateKeyFileen la cadena de conexión a un archivo.pemque contenga la cadena del certificado raízUsar la función
mongoc_uri_set_option_as_utf8()para establecer la opciónMONGOC_URI_TLSCERTIFICATEKEYFILEen un archivo.pemque contenga la cadena de certificados raíz
Verificación de certificado de servidor
El driver de MongoDB en C verificará automáticamente la validez de un certificado de servidor emitido por la Autoridad Certificadora configurada. El controlador también realiza la validación del nombre de host y la verificación de revocación.
Para sobrescribir este comportamiento, se puede desactivar la validación del nombre de host, la comprobación de revocación del punto final de OCSP, toda la comprobación de revocación y permitir certificados no válidos.
Este comportamiento se controla utilizando las opciones tlsAllowInvalidHostnames, tlsDisableOCSPEndpointCheck, tlsDisableCertificateRevocationCheck y tlsAllowInvalidCertificates. Por defecto, todos están configurados en false.
No se recomienda cambiar estos valores predeterminados, ya que podrías exponer a tu cliente a los siguientes riesgos de seguridad:
Man In The Middle attacks, when
tlsAllowInvalidHostnamesis setCertificados no válidos, cuando
tlsAllowInvalidCertificatesestá configuradoCertificados potencialmente revocados, cuando
tlsDisableOCSPEndpointCheckotlsDisableCertificateRevocationCheckestán configurados
Nota
Let's Encrypt OCSP Deprecation
Let's Encrypt has ended OCSP support for newer certificates. New certificates issued by Let's Encrypt might not include an OCSP responder URL. OCSP revocation checking occurs only when a certificate contains an OCSP URI, so a missing OCSP URL is expected and doesn't necessarily indicate a problem with your MongoDB deployment.
Librerías compatibles
Por defecto, libmongoc intentará encontrar una librería TLS compatible y habilitar el soporte TLS. Esto está controlado por la bandera cmake ENABLE_SSL, que está configurada en AUTO por defecto. Esta bandera acepta los siguientes valores:
AUTOEnlaza con la librería TLS nativa del sistema o intenta encontrar OpenSSL. Este es el valor por defecto.OPENSSL: Enlaces a OpenSSL (libssl). Se puede especificar una ruta de instalación opcional conOPENSSL_ROOT.WINDOWS: Enlaces a Canal seguro, la librería nativa de TLS en Windows.DARWIN: Enlaces a Secure Transport, la librería TLS nativa de macOS.OFFDesactiva el soporte para TLS.
OpenSSL
El driver C de MongoDB usa OpenSSL en plataformas Linux y Unix (excepto macOS). Las mejores prácticas del sector y algunas normativas exigen el uso de TLS 1.1 o superior, lo que requiere al menos OpenSSL 1.0.1. Utiliza el siguiente comando para verificar tu versión de OpenSSL:
openssl version
Asegúrese de que OpenSSL de su sistema sea una versión reciente (al menos 1.0.1), o utilice el siguiente comando para instalar una versión reciente en una ruta que no sea del sistema y compilar contra ella:
cmake -DOPENSSL_ROOT_DIR=/absolute/path/to/openssl
Al compilarse con OpenSSL, el driver intentará cargar el almacén de certificados por defecto del sistema, tal como lo configura la distribución. Esto se puede anular configurando la opción URI tlsCAFile o con los campos ca_file y ca_dir en el mongoc_ssl_opt_t.
El Protocolo de estado de certificado en línea (OCSP) es totalmente compatible cuando se utiliza OpenSSL 1.0.1+. Sin embargo, cuando crl_file se establece un con mongoc_ssl_opt_t y el crl_file revoca el certificado del servidor, el certificado se considera revocado, incluso si el certificado tiene una respuesta OCSP válida adjunta.
Tip
Para obtener más información sobre OCSP, consulte RFC.6960
Compatibilidad TLS nativa en Windows (Secure canal)
El driver C de MongoDB soporta la librería nativa de TLS de Windows (Secure canal, o SChannel) y su librería nativa de criptografía (Cryptography API: siguiente Generation, o CNG).
When compiled against the Windows native libraries, the ca_dir option of a mongoc_ssl_opt_t is not supported and issues an error if used. Encrypted PEM files, set by using the tlsCertificateKeyPassword URI option, are also not supported and issue errors when you attempt to load them.
La opción URI tlsCertificateKeyFile puede referirse a un certificado codificado en el formato PKCS#8 o PKCS#1. A partir de la versión 2.1.0 del driver C, el driver importa la llave privada como una clave persistente para admitir algoritmos de firma modernos. En versiones anteriores, el controlador importaba la clave como efímera. Para obtener más información sobre la gestión de claves importadas, consulte Gestión de claves importadas.
Cuando se establece tlsCAFile, el driver importa el archivo de la Autoridad Certificadora al almacén de certificados System Local Machine Root. Cuando no se configura tlsCAFile, el driver busca el archivo de la Autoridad Certificadora utilizando el almacén de certificados System Local Machine Root para confirmar el certificado proporcionado.
When crl_file is set with mongoc_ssl_opt_t, the driver imports the revocation list to the System Local Machine Root certificate store. Setting tlsDisableOCSPEndpointCheck has no effect.
El Protocolo de Estado de Certificados en Línea (OCSP) es parcialmente compatible, con las siguientes notas:
La extensión Must-Staple (ver 7633RFC) se ignora.
La conexión continuará si se presenta un certificado Must-Staple sin una respuesta adjunta y el respondedor OCSP está inactivo.
La conexión no continuará si el cliente recibe una respuesta revocada de un respondedor OCSP.
When a
crl_fileis set with mongoc_ssl_opt_t, and thecrl_filerevokes the server's certificate, the OCSP response takes precedence. For example, if the server presents a certificate with a valid stapled OCSP response, the certificate is considered valid even if thecrl_filemarks it as revoked.
Tip
For more information about OCSP, see RFC 6960.
Administrar claves importadas
El controlador de C importa llaves PKCS#8 en el CNG KSP: Microsoft Software Key Storage Provider y importa llaves PKCS#1 en el CSP de CryptoAPI heredado: Microsoft Enhanced Cryptographic Provider v1.0. Para obtener más información sobre la importación de claves, consulta Almacenamiento y recuperación de claves en la documentación de Microsoft.
Después de importar las claves, es posible que deba calcular el nombre del clave y el proveedor, ver la clave o borrar la clave. El siguiente código de PowerShell calcula el nombre de clave y los proveedores:
$cert = "client.pem" # Compute the SHA256 fingerprint: $fingerprint = (openssl x509 -in $cert -noout -fingerprint -sha256) -replace 'SHA256 Fingerprint=', '' -replace ':', '' if (Select-String -Path $cert -Pattern '-----BEGIN RSA PRIVATE KEY-----' -Quiet) { # Key name for PKCS#1 key: $key_name = "libmongoc-$fingerprint-pkcs1" $csp = "Microsoft Enhanced Cryptographic Provider v1.0" } elseif (Select-String -Path $cert -Pattern '-----BEGIN PRIVATE KEY-----' -Quiet) { # Key name for PKCS#8 key: $key_name = "libmongoc-$fingerprint-pkcs8" $csp = "Microsoft Software Key Storage Provider" } else { Write-Output "Unexpected PEM format for $cert" }
El siguiente código de PowerShell muestra detalles sobre la clave:
certutil -user -csp $csp -key $key_name
El siguiente código de PowerShell borra la clave:
certutil -user -csp $csp -key $key_name
Soporte nativo de TLS en macOS / Darwin (Secure Transport)
El driver C de MongoDB es compatible tanto con la librería TLS nativa de Darwin como con Common Crypto, su librería criptográfica nativa.
Cuando se compila contra Secure Transport, las opciones ca_dir y crl_file de una mongoc_ssl_opt_t no son compatibles. Se emite un error si se utiliza cualquiera de los dos.
Cuando se establece tlsCAFile, el controlador solo permitirá los certificados de servidor emitidos por la autoridad (o autoridades) proporcionadas. Cuando no se establece tlsCAFile, el driver usará las autoridades certificadoras en los llaveros desbloqueados.
Establecer tlsDisableOCSPEndpointCheck y tlsDisableCertificateRevocationCheck no tiene efecto al compilar contra el transporte seguro.
El Protocolo de Estado de Certificado En línea (OCSP) está parcialmente soportado con las siguientes notas.
La extensión Must-Staple (véase 7633RFC) se ignora.
La conexión continuará si se presenta un certificado Must-Staple sin una respuesta adjunta y el responedor OCSP está inactivo
La conexión no continuará si el cliente recibe una respuesta revocada de un respondedor OCSP
Tip
For more information about OCSP, see RFC 6960.
Documentación de la API
Para obtener más información sobre los objetos y funciones mencionados en esta guía, consulta la siguiente documentación de la API: