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 su implementación de MongoDB para TLS, consulte la 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 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 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_cert:El archivo de certificado utilizado 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' )
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:
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 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 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
Puede 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 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 | 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 del archivo que contiene los certificados CA concatenados que se utilizan para validar los certificados pasados 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 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 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 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 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 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 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 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: 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.tlsAllowInvalidHostnames: Deshabilite 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 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: