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 TLS Protocolo para proteger su conexión a una implementación de MongoDB.

Cuando habilites TLS para una conexión, la librería de PHP ejecuta 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

La librería PHP delega la mayoría del comportamiento TLS al MongoDB C Driver. Para obtener información sobre cómo el driver de C gestiona TLS, incluidos los pasos de configuración y el comportamiento esperado, consulta Configurar TLS en la documentación del driver de C.

Para habilitar TLS para la conexión a tu implementación de MongoDB, configura la tls opción de conexión a true. Puedes hacerlo de dos maneras: utilizando el parámetro uriOptions del constructor MongoDB\Client o mediante un parámetro en tu 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 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.

Durante el handshake TLS, la implementación de MongoDB presenta a tu aplicación un archivo clave de certificado para establecer su identidad. Generalmente, un certificado de implementación ha sido firmado por una CA (autoridad certificadora) reconocida y la aplicación depende de esta CA para validar el certificado.

Sin embargo, durante las pruebas, puede que quieras actuar como tu propio CA. En este caso, debe indicar a la librería PHP que utilice sus certificados CA en lugar de los firmados por otra CA.

Para ello, utiliza la opción de conexión tlsCAFile para especificar la ruta a un archivo .pem que contenga la cadena de certificados raíz. Puedes hacerlo de dos maneras: mediante el parámetro uriOptions del constructor MongoDB\Client o mediante un parámetro en tu 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 utilizas OpenSSL o LibreSSL (libtls) para el soporte con TLS, también puedes usar la opción ca_dir para indicarle a la librería PHP que busque un archivo CA dentro de un directorio. El driver 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 usar 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 ha sido comprometida—, la CA revoca el certificado. La librería PHP incluye dos formas de verificar 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 librería de PHP se comunique con el endpoint OCSP, establece la opción de conexión tlsDisableOCSPEndpointCheck en true. Puedes hacer esto de dos maneras: pasando un argumento al constructor de MongoDB\Client o mediante un parámetro en tu 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 librería de PHP debe presentar, establece la opción tleCertificateKeyFile en la ruta de acceso al archivo .pem que contiene tu certificado y llave 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á activado, la librería PHP 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. Puedes hacer esto de dos maneras: pasando un argumento al constructor MongoDB\Client o mediante un parámetro en tu 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 desactivar únicamente la validación del certificado, establece la opción tlsAllowInvalidCertificates en true y la opción tlsInsecure en false o déjala fuera:

$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 desactivar únicamente la verificación del nombre de host, establece la opción tlsAllowInvalidHostnames en true, y ajusta la opción tlsInsecure a false o déjala fuera:

$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

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.

Para aprender más sobre la configuración de TLS para la librería PHP, consulte la siguiente documentación de la API:

  • MongoDB\Client

Volver

Encriptación en uso

En esta página