Overview
En esta guía, puede aprender a utilizar el protocolo de seguridad de la capa de transporte (TLS) para proteger su conexión a una implementación de MongoDB.
Para conectarse a una implementación de MongoDB mediante TLS, debe realizar los siguientes pasos:
Habilitar una conexión TLS en
Mongo::Client.Especifique el certificado TLS del cliente.
Especifica el certificado de la autoridad certificadora (CA) para verificar el certificado TLS del servidor.
Para aprender a configurar su implementación de MongoDB para TLS, consulte la Guía de configuración de TLS en el manual del servidor MongoDB.
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 CA queda fuera del alcance de esta documentación. Para obtener más información sobre TLS, consulte la entrada de Wikipedia sobre Seguridad de la Capa de Transporte.
Habilitar TLS
Puede habilitar TLS para la conexión a su implementación de MongoDB de las siguientes maneras:
Establezca la opción
sslentrueen un nuevo objetoMongo:Client.Establezca la opción
tlsentrueen su cadena de conexión.
Nota
Convención de nomenclatura SSL
Todas las versiones de MongoDB Server compatibles con el controlador Ruby v2.6 y posteriores implementan solo TLS. 2.6 y no usan SSL.
Por razones históricas, el driver Ruby antepone las opciones de TLS con ssl en lugar de tls. La versión 3.0 y posteriores del driver Ruby utilizarán el prefijo tls para los nombres de opciones de Ruby.
Para configurar certificados, debe especificar las siguientes opciones:
ssl_cert:El archivo de certificado utilizado para verificar la conexión a una implementación de MongoDB.ssl_key:El archivo de clave privada utilizado para verificar la conexión a una implementación de MongoDB.ssl_ca_cert: El archivo que contiene los certificados de CA concatenados que se utilizan para validar los certificados transferidos desde la implementación de MongoDB al cliente. Si no se especifica un valor para esta opción, el controlador utiliza el almacén de certificados raíz del sistema predeterminado como ancla de confianza.
En el siguiente ejemplo, el certificado TLS y la clave privada correspondiente se proporcionan en archivos separados:
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_cert: 'path/to/client.crt', ssl_key: 'path/to/client.key', ssl_ca_cert: 'path/to/ca.crt' )
Puede especificar el certificado TLS y la clave privada en un solo archivo, pero ambas opciones deben especificarse. En el siguiente ejemplo, el certificado TLS y la clave privada se definen en el mismo archivo client.pem:
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_cert: 'path/to/client.pem', ssl_key: 'path/to/client.pem', ssl_ca_cert: 'path/to/ca.crt', )
Para configurar certificados, debe especificar las siguientes opciones de URI:
tlsCertificateKeyFile:El archivo que contiene el certificado y el archivo de clave utilizados para verificar la conexión a una implementación de MongoDB.tlsCAFile: El archivo que contiene los certificados de CA concatenados que se utilizan para validar los certificados transferidos desde la implementación de MongoDB al cliente. Si no se especifica un valor para esta opción, el controlador utiliza el almacén de certificados raíz del sistema predeterminado como ancla de confianza.
client = Mongo::Client.new( "mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=path%2fto%2fclient.pem&tlsCAFile=path%2fto%2fca.crt")
El archivo que contiene el certificado y la clave generalmente tiene una extensión ".crt" o .pem.
Los valores de las opciones de URI deben codificarse con porcentaje. Esto se aplica, por ejemplo, a las barras diagonales (/) en las rutas, que se codifican como %2f.
Especificar certificados TLS de cliente
El controlador Ruby proporciona múltiples opciones para que usted especifique el certificado TLS, la clave y el certificado CA con diferentes tipos de datos u objetos.
Certificado TLS
Puede proporcionar una de las siguientes opciones para especificar el certificado TLS:
Nombre de la opción | Tipo de dato/objeto aceptado | Descripción |
|---|---|---|
|
| La ruta del archivo de certificado utilizada para verificar la conexión a una implementación de MongoDB. |
|
| El objeto de certificado utilizado para verificar la conexión a una implementación de MongoDB. |
|
| Una cadena que contiene el certificado codificado en PEM utilizado para verificar la conexión a una implementación de MongoDB. |
Clave privada TLS
Puede proporcionar una de las siguientes opciones para especificar la clave privada TLS:
Nombre de la opción | Tipo de dato/objeto aceptado | Descripción |
|---|---|---|
|
| La ruta del archivo de clave privada utilizada para verificar la conexión a una implementación de MongoDB. |
|
| El objeto de clave privada utilizado para verificar la conexión a una implementación de MongoDB. |
|
| Una frase de contraseña para la clave privada. |
|
| Una cadena que contiene la clave privada codificada en PEM utilizada para verificar la conexión a una implementación de MongoDB. |
Certificado CA TLS
Puede proporcionar una de las siguientes opciones para especificar el certificado CA TLS:
Nombre de la opción | Tipo de dato/objeto aceptado | Descripción |
|---|---|---|
|
| La ruta del archivo que contiene los certificados CA concatenados que se utilizan para validar los certificados pasados desde la implementación de MongoDB al cliente. |
|
| Una matriz de objetos que representan los certificados de CA utilizados para validar los certificados pasados desde la implementación de MongoDB al cliente. |
|
| Una cadena que contiene un certificado CA codificado en PEM que se utiliza para validar los certificados pasados desde la implementación de MongoDB al cliente. |
Modificar el contexto TLS
Si su configuración de TLS requiere personalización, puede configurar los ganchos de contexto de TLS añadiendo un objeto Ruby nativo Proc a la matriz Mongo.tls_context_hooks. Añada el objeto Proc a la matriz antes de crear cualquier instancia Mongo::Client.
El siguiente ejemplo de código permite el cifrado AES256-SHA como el único cifrado que se utilizará para TLS:
Mongo.tls_context_hooks.push( Proc.new { |context| context.ciphers = ["AES256-SHA"] } )
Las opciones de contexto TLS del controlador Ruby se basan en la gestión nativa de SSL de Ruby. Para obtener más información sobre las opciones de contexto TLS disponibles, consulte la documentación de Ruby para SSLContext.
Verificación OCSP
Si el certificado proporcionado por el servidor contiene un URI de punto final OCSP, el controlador emite una solicitud de Protocolo de estado de certificado en línea (OCSP) al punto final especificado de manera predeterminada para verificar la validez del certificado.
Para deshabilitar la verificación del punto final de OCSP, configure la opción Ruby :ssl_verify_ocsp_endpoint en false o configure la opción URI tlsDisableOCSPEndpointCheck en true al crear un cliente.
Nota
JRuby no admite la verificación OCSP
Debido a que JRuby no expone correctamente los URI de los puntos finales del OCSP, el controlador no comprueba los puntos finales del OCSP cuando la aplicación subyacente se ejecuta en JRuby.
Permitir TLS inseguro
Cuando TLS está habilitado, el controlador Ruby 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 cliente sslVerify o la opción URI tlsInsecure en true:
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_verify: false )
client = Mongo::Client.new('mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true')
De igual modo, puedes establecer las siguientes opciones para deshabilitar la verificación del certificado o nombre de host:
ssl_verify_certificate:Deshabilite la validación del certificado configurando la opción enfalse.ssl_verify_hostname:Deshabilite la verificación del nombre de host configurando la opción enfalse.
tlsAllowInvalidCertificates:Deshabilite la validación del certificado configurando la opción entrue.tlsAllowInvalidHostnames: Deshabilite la validación del nombre de host configurando la opción entrue.
Advertencia
No utilice TLS inseguro en producción
Deshabilite siempre TLS inseguro en producción.
Habilitar TLS inseguro en un entorno de producción hace que su aplicación sea insegura y potencialmente vulnerable a certificados vencidos y procesos externos que se hacen pasar por instancias de cliente válidas.
Documentación de la API
Para obtener más información sobre cualquiera de los tipos y métodos analizados en esta guía, consulte la siguiente documentación de API: