Overview
En esta guía, puedes aprender cómo utilizar el protocolo Transport Layer Security (TLS) para asegurar tu conexión a una implementación de MongoDB.
Para conectarse a una implementación de MongoDB usando TLS, debe realizar los siguientes pasos:
Habilitar una conexión TLS en
Mongo::Client.Especificar el certificado TLS del cliente.
Especifica el certificado de la autoridad certificadora (CA) para verificar el certificado TLS del servidor.
Para aprender a configurar tu implementación de MongoDB para TLS, consulta Guía de configuración TLS en el manual del MongoDB Server.
Nota
Esta página asume un conocimiento previo de TLS/SSL y acceso a certificados válidos. Una descripción completa de TLS/SSL, certificados PKI (Infraestructura de llave pública) y CAs está más allá del alcance de esta documentación. Para obtener más información sobre TLS, consulta la entrada de Wikipedia para Seguridad de la capa de transporte.
Habilitar TLS
Puede habilitar el TLS para la conexión a su implementación de MongoDB de las siguientes maneras:
Establezca la opción
sslentrueen un nuevo objetoMongo:Client.Configura la opción
tlsentrueen tu cadena de conexión.
Nota
Convención de nomenclatura SSL
Todas las versiones del MongoDB Server respaldadas por el driver Ruby v2.6 y posteriores implementan sólo TLS. 2.6 y no utilizan 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 los certificados, debes especificar las siguientes opciones:
ssl_certEl archivo de certificado se utiliza para verificar la conexión a una implementación de MongoDB.ssl_key: La clave privada usada para verificar la conexión a una implementación de MongoDB.ssl_ca_certEl archivo que contiene los certificados CA combinados utilizados para validar los certificados que se pasan de la implementación de MongoDB al cliente. Si no especificas un valor para esta opción, el driver utiliza el almacén por defecto de certificados raíz del sistema como ancla de confianza.
En el siguiente ejemplo, el certificado TLS y la llave 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' )
Puedes especificar tanto el certificado TLS como la clave privada en un único archivo, pero se deben seguir especificando tanto las opciones de certificado como las de clave privada. En el siguiente ejemplo, el certificado TLS y la clave privada se definen ambos 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:
tlsCertificateKeyFileEl archivo que contiene el certificado y el archivo de clave utilizados para verificar la conexión a una implementación de MongoDB.tlsCAFileEl archivo que contiene los certificados CA combinados utilizados para validar los certificados que se pasan de la implementación de MongoDB al cliente. Si no especificas un valor para esta opción, el driver utiliza el almacén por defecto de certificados raíz del sistema 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 suele tener una extensión ``.crt`` o .pem.
Los valores de las opciones de URI deben estar codificados en porcentaje. Esto se aplica, por ejemplo, a las barras oblicuas (/) en las rutas, que se codifican como %2f.
Especificar certificados TLS de cliente
El driver Ruby ofrece múltiples opciones para que especifiques el certificado TLS, la clave y el certificado CA con diferentes tipos de datos o tipos de objeto Realm.
Certificado TLS
Puedes proporcionar una de las siguientes opciones para especificar el certificado TLS:
Nombre de la opción | Datos/tipo de objeto Realm 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 se utiliza para verificar la conexión a una implementación de MongoDB. |
|
| Una string 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 | Datos/tipo de objeto Realm 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 se utiliza para verificar la conexión a una implementación de MongoDB. |
|
| Una frase secreta para la llave privada. |
|
| Una string que contiene la clave privada codificada en PEM utilizada para verificar la conexión a una implementación de MongoDB. |
Certificado TLS CA
Puede proporcionar una de las siguientes opciones para especificar el certificado TLS CA:
Nombre de la opción | Datos/tipo de objeto Realm aceptado | Descripción |
|---|---|---|
|
| La ruta de archivo que contiene certificados CA concatenados usados para validar certificados transmitidos desde la implementación de MongoDB al cliente. |
|
| Un arreglo de objetos que representa los certificados CA utilizados para validar los certificados que se pasan desde la implementación de MongoDB al cliente. |
|
| Una string que contiene un certificado de CA codificado en PEM utilizado para validar los certificados transferidos desde la implementación de MongoDB al cliente. |
Modificar el contexto TLS
Si tu configuración de TLS requiere personalización, puedes establecer hooks de contexto TLS añadiendo un objeto Ruby Proc nativo al arreglo Mongo.tls_context_hooks. Agregue el objeto Proc al arreglo 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 del contexto TLS del controlador Ruby se basan en el manejo nativo de SSL de Ruby. Para obtener más información sobre las opciones de contexto TLS disponibles, consulta la documentación de Ruby para SSLContext.
verificación OCSP
Si el certificado proporcionado por el servidor contiene una URI de endpoint OCSP, el controlador emite por defecto una solicitud del Protocolo de Estado de Certificados en Línea (OCSP) al endpoint especificado para verificar la validez del certificado.
Para deshabilitar la verificación del endpoint de OCSP, configúre 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 no seguro
Cuando TLS está habilitado, el controlador Ruby 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 TLS inseguro está activado, la comunicación entre el cliente y el servidor está cifrada con TLS.
Para habilitar el TLS no seguro, establece la opción del 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: Deshabilitar la validación de certificados configurando la opción enfalse.ssl_verify_hostname: Deshabilita la verificación del nombre de host estableciendo la opción enfalse.
tlsAllowInvalidCertificates: Deshabilitar la validación de certificados configurando la opción entrue.tlsAllowInvalidHostnamesDeshabilita la validación del nombre de host configurando la opción entrue.
Advertencia
No use TLS inseguro en producción
Desactive siempre TLS inseguro en producción.
Habilitar TLS inseguro en un entorno de producción hace que tu aplicación sea insegura y potencialmente vulnerable a certificados caducados y a procesos externos que se hacen pasar por instancias válidas de clientes.
Documentación de la API
Para obtener más información sobre cualquiera de los tipos y métodos discutidos en esta guía, consulta la siguiente documentación de la API: