Docs Menu
Docs Home
/ /

Configurar la Seguridad de la Capa de Transporte (TLS)

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

Cuando habilita TLS para una conexión, la biblioteca PHP 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

La biblioteca PHP 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 implementación de MongoDB, configure la tls Opción de conexión a true. Puede hacerlo de dos maneras: usando el parámetro uriOptions del constructor MongoDB\Client o mediante un parámetro en su cadena de conexión.

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true';
$client = MongoDB\Client($uri);

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 (autoridad de certificación) 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 a la biblioteca PHP que use sus certificados de CA en lugar de los firmados por otra CA.

Para ello, utilice la opción de conexión tlsCAFile para especificar la ruta a un archivo .pem que contenga la cadena del certificado raíz. Puede hacerlo de dos maneras: mediante el parámetro uriOptions del constructor MongoDB\Client o mediante un parámetro en la cadena de conexión.

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true,
'tlsCAFile' => '/path/to/ca.pem',
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsCAFile=/path/to/ca.pem';
$client = MongoDB\Client($uri);

Si usa OpenSSL o LibreSSL (libtls) para compatibilidad con TLS, también puede usar la opción ca_dir para indicar a la biblioteca PHP 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.

El siguiente ejemplo de código muestra cómo utilizar el parámetro driverOptions para especificar la opción ca_dir:

<?php
$uri = 'mongodb://<hostname>:<port>';
$uriOptions = ['tls' => true];
$driverOptions = ['ca_dir' => '/path/to/search/'];
$client = new MongoDB\Client($uri, $uriOptions, $driverOptions);

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. La biblioteca PHP 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 adjunta una respuesta OCSP con marca de tiempo a su certificado. La biblioteca PHP 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 la biblioteca PHP contacta directamente. La biblioteca PHP 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 la biblioteca PHP contacte con el punto final de OCSP, configure la opción de conexión tlsDisableOCSPEndpointCheck en true. Puede hacerlo de dos maneras: pasando un argumento al constructor MongoDB\Client o mediante un parámetro en su cadena de conexión.

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true,
'tlsDisableOCSPEndpointCheck' => true,
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsDisableOCSPEndpointCheck=true';
$client = MongoDB\Client($uri);

Nota

Incluso si la opción tlsDisableOCSPEndpointCheck está establecida en true, la biblioteca PHP aún verifica cualquier respuesta OCSP adjunta al certificado de un servidor.

En lugar de usar OCSP, se puede instruir a la librería de PHP para que verifique el certificado del servidor con una Lista de revocación de certificados (CRL) publicada por la CA. Para ello, configura la opción crl_file en la ruta del archivo del CRL. Incluya esta opción en el parámetro driverOptions del constructor MongoDB\Client, como se muestra en el siguiente ejemplo de código:

<?php
$uri = 'mongodb://<hostname>:<port>';
$uriOptions = ['tls' => true];
$driverOptions = ['crl_file' => '/path/to/file.pem'];
$client = new MongoDB\Client($uri, $uriOptions, $driverOptions);

Tip

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

Algunas implementaciones de MongoDB requieren que cada aplicación que se conecte presente un certificado de cliente que acredite su identidad. Para especificar el certificado de cliente que la biblioteca PHP debe presentar, configure la opción tleCertificateKeyFile con la ruta del archivo .pem que contiene su certificado y clave privada.

Esto se puede hacer de dos maneras: usando el parámetro uriOptions del constructor MongoDB\Client o a través de un parámetro en la cadena de conexión.

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true,
'tlsCertificateKeyFile' => '/path/to/client.pem',
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/client.pem';
$client = MongoDB\Client($uri);

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 tu archivo de certificado está cifrada, debes usar la opción tlsCertificateKeyFilePassword para proporcionar la contraseña. Puedes hacerlo de dos maneras: usando el parámetro uriOptions del constructor MongoDB\Client o a través de un parámetro en tu cadena de conexión.

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true,
'tlsCertificateKeyFile' => '/path/to/client.pem',
'tlsCertificateKeyFilePassword' => '<passphrase>',
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/client.pem&tlsCertificateKeyFilePassword=<passphrase>';
$client = MongoDB\Client($uri);

Cuando TLS está habilitado, la biblioteca PHP 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. Puede hacerlo de dos maneras: pasando un argumento al constructor MongoDB\Client o mediante un parámetro en su cadena de conexión.

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true,
'tlsInsecure' => true,
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true';
$client = MongoDB\Client($uri);

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

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true,
'tlsAllowInvalidCertificates' => true,
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidCertificates=true';
$client = MongoDB\Client($uri);

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 u omítala:

$uri = 'mongodb://<hostname>:<port>';
$options = [
'tls' => true,
'tlsAllowInvalidHostnames' => true,
];
$client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidHostnames=true';
$client = MongoDB\Client($uri);

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 la biblioteca PHP, consulte la siguiente documentación de API:

  • MongoDB\Client

Volver

Encriptación en uso

En esta página