Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Configurar la Seguridad de la Capa de Transporte (TLS)

En esta guía, puedes aprender cómo 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.

Puedes habilitar TLS en una conexión a tu instancia de MongoDB de las siguientes maneras:

  • Configurando el tls parámetro en tu cadena de conexión

  • Usando la función mongoc_uri_set_option_as_bool() para establecer la opción de conexión MONGOC_URI_TLS en true

mongoc_client_t *client = mongoc_client_new("mongodb+srv://<db_username>:<db_password>@<hostname>/?tls=true");
// Do database work here
mongoc_client_destroy(client);
mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost:27017");
mongoc_uri_set_option_as_bool(uri, MONGOC_URI_TLS, true);
mongoc_client_t *client = mongoc_client_new_from_uri(uri);
// Do database work here
mongoc_client_destroy(client);
mongoc_uri_destroy(uri);

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.

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 tlsCertificateKeyFile en su cadena de conexión en un archivo .pem que contiene la cadena de certificado raíz

  • Usar la función mongoc_uri_set_option_as_utf8() para establecer la opción MONGOC_URI_TLSCERTIFICATEKEYFILE en un archivo .pem que contenga la cadena de certificados raíz

mongoc_client_t *client = mongoc_client_new("mongodb+srv://<db_username>:<db_password>@<hostname>/?tls=true&tlscertificatekeyfile=/path/to/certs/client-certificate.pem");
// Do database work here
mongoc_client_destroy(client);
mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost:27017");
mongoc_uri_set_option_as_bool(uri, MONGOC_URI_TLS, true);
mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "/path/to/client-certificate.pem");
mongoc_client_t *client = mongoc_client_new_from_uri(uri);
// Do database work here
mongoc_client_destroy(client);
mongoc_uri_destroy(uri);

El controlador C de MongoDB verificará automáticamente la validez de un certificado de servidor emitido por la autoridad de certificación configurada. El controlador también realiza la validación del nombre de host y la comprobació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 mediante las opciones tlsAllowInvalidHostnames, tlsDisableOCSPEndpointCheck, tlsDisableCertificateRevocationCheck y tlsAllowInvalidCertificates. De forma predeterminada, todas están configuradas en false.

No se recomienda cambiar estos valores predeterminados, ya que podría exponer a su cliente a los siguientes riesgos de seguridad:

  • Ataques Man In The Middle, cuando tlsAllowInvalidHostnames está activado

  • Certificados no válidos, cuando tlsAllowInvalidCertificates está configurado

  • Certificados potencialmente revocados, cuando tlsDisableOCSPEndpointCheck o tlsDisableCertificateRevocationCheck están configurados

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:

  • AUTO: Enlace a la biblioteca TLS nativa del sistema o intenta encontrar OpenSSL. Este es el valor predeterminado.

  • OPENSSL: Enlaces a OpenSSL (libssl). Se puede especificar una ruta de instalación opcional con OPENSSL_ROOT.

  • WINDOWS:Enlaces a Secure Channel, la biblioteca TLS nativa en Windows.

  • DARWIN: Enlaces a Secure Transport, la librería TLS nativa de macOS.

  • OFFDesactiva el soporte para TLS.

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 la versión de OpenSSL de su sistema sea 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 compilarla en 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) está completamente soportado cuando se utiliza OpenSSL 1.0.1+}. Sin embargo, cuando se configura un crl_file 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.

El controlador C de MongoDB admite la biblioteca TLS nativa de Windows (Secure Channel o SChannel) y su biblioteca de criptografía nativa (Cryptography API: Next Generation o CNG).

Cuando se compila con las librerías nativas de Windows, la opción ca_dir de un mongoc_ssl_opt_t no es compatible y emite un error si se utiliza. Los archivos PEM cifrados, configurados mediante la opción URI tlsCertificateKeyPassword, tampoco son compatibles y emiten errores cuando se intenta cargarlos.

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.

Cuando se establece crl_file con mongoc_ssl_opt_t, el driver importa la lista de revocación al almacén de certificados System Local Machine Root. Establecer tlsDisableOCSPEndpointCheck no tiene efecto.

El Protocolo de Estado de Certificados en Línea (OCSP) es parcialmente compatible, con las siguientes notas:

  • La extensión Must-Staple (ver RFC 7633) 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.

  • Cuando se configura un crl_file con mongoc_ssl_opt_t, y el crl_file revoca el certificado del servidor, la respuesta OCSP tiene prioridad. Por ejemplo, si el servidor presenta un certificado con una respuesta OCSP adherida válida, el certificado se considera válido incluso si el crl_file lo marca como revocado.

Tip

Para obtener más información sobre OCSP, consulte RFC 6960.

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

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.

Al compilar con Secure Transport, no se ca_dir crl_file admiten las opciones y de mongoc_ssl_opt_t. Si se utiliza alguna de ellas, se genera un error.

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 (ver 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

Para obtener más información sobre OCSP, consulte RFC 6960.

Para obtener más información sobre los objetos y funciones mencionados en esta guía, consulte la siguiente documentación de API:

Volver

Seguridad

En esta página