Overview
En esta guía, puede aprender cómo conectarse a instancias de MongoDB con el Protocolo de seguridadTLS/SSL que utiliza la compatibilidad subyacente con TLS/SSL en .NET Framework. Para configurar su conexión para usar TLS/SSL, habilite la configuración de TLS/SSL en... cadena de conexión o MongoClientSettings.
Habilitar TLS
De forma predeterminada, TLS está deshabilitado al conectarse a instancias de MongoDB. Puede habilitar TLS para la conexión a su instancia de MongoDB de dos maneras diferentes: mediante una propiedad en un MongoClientSettings objeto o a través de un parámetro en su cadena de conexión.
Nota
Si se conecta mediante el protocolo de lista de semillas DNS, el controlador habilita TLS/SSL de forma predeterminada. Para deshabilitarlo, configure el valor del parámetro tls o ssl en false en su cadena de conexión o instancia MongoClientSettings.
Para obtener más información sobre el comportamiento de la conexión cuando utiliza una lista de semillas DNS, consulte la sección Formato de conexión SRV en el manual del servidor.
Para habilitar TLS con un objeto MongoClientSettings, establezca la propiedad UseTls en true:
var settings = new MongoClientSettings { UseTls = true }; var client = new MongoClient(settings);
Para habilitar TLS con una cadena de conexión, asigne al parámetro tls un valor de true en la cadena de conexión pasada al constructor MongoClient:
var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>?tls=true");
Configurar un certificado de cliente
Puede configurar su certificado X.509 usando MongoClientSettings. El siguiente ejemplo de código crea un nuevo objeto de certificado X.509 usando el archivo de certificado client.p12, protegido por la contraseña mySuperSecretPassword. A continuación, el código añade este certificado a la matriz SslSettings.ClientCertificates en MongoClientSettings.
var cert = new X509Certificate2("client.p12", "mySuperSecretPassword"); var settings = new MongoClientSettings { SslSettings = new SslSettings { ClientCertificates = new[] { cert } }, UseTls = true };
Importante
Al cargar un certificado con contraseña, el objeto del certificado debe contener una clave privada. De lo contrario, el certificado no se enviará al servidor.
Permitir TLS inseguro
Cuando TLS está habilitado, el controlador .NET/C# verifica automáticamente el certificado que presenta el servidor. Al probar el código, puede deshabilitar la verificación del certificado. Esto se conoce como TLS inseguro.
Al usar TLS inseguro, el único requisito es que el servidor presente un certificado X.509. El controlador aceptará 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.
Puede permitir TLS inseguro de dos maneras diferentes: utilizando una propiedad en un objeto MongoClientSettings o a través de un parámetro en su cadena de conexión.
Para permitir TLS inseguro con un objeto MongoClientSettings, establezca la propiedad AllowInsecureTls en true:
var settings = new MongoClientSettings { UseTls = true, AllowInsecureTls = true }; var client = new MongoClient(settings);
Para permitir TLS inseguro mediante una cadena de conexión, asigne al parámetro de cadena de conexión tlsInsecure un valor de true:
var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>?tls=true&tlsInsecure=true");
Advertencia
Establezca siempre esta opción en false en producción. Por razones de seguridad, es importante que el certificado del servidor esté correctamente validado.
Comprobar revocación de certificado
Cuando ya no se debe confiar en un certificado X.509 (por ejemplo, si su clave privada se ha visto comprometida), la autoridad certificadora revocará el certificado.
De forma predeterminada, el controlador .NET/C# no comprueba si el certificado de un servidor ha sido revocado antes de conectarse. Puede habilitar la comprobación de revocación mediante MongoClientSettings o la cadena de conexión.
Para habilitar la comprobación de revocación usando MongoClientSettings, configure SslSettings.CheckCertificateRevocation en true:
var settings = new MongoClientSettings { SslSettings = new SslSettings { CheckCertificateRevocation = true }, UseTls = true };
Para habilitar la verificación de revocación mediante una cadena de conexión, asigna el valor false al parámetro de cadena de conexión tlsDisableCertificateRevocationCheck:
var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>?tls=true&tlsDisableCertificateRevocationCheck=false");
Nota
El controlador .NET/C# no verifica la revocación de manera predeterminada porque este es el comportamiento predeterminado de la SslStream clase tanto en el marco .NET como en el estándar .NET.
Comprobación de revocación por sistema operativo
El controlador .NET/C# admite los siguientes mecanismos de comprobación de revocación de forma diferente en Windows, macOS y Linux:
Protocolo deestado de certificado en línea (OCSP), un mecanismo común para comprobar la revocación
OCSP stapling, un mecanismo en el que el servidor incluye una respuesta OCSP marcada con tiempo al cliente junto con el certificado
Listas de revocación de certificados (CRL), una alternativa a OCSP
Windows
En Windows, el controlador .NET/C# admite OCSP, grapado de OCSP y CRL sin OCSP, tanto en .NET Framework como en .NET Core.
Advertencia
En Windows, el driver de .NET/C# notifica un "fallo grave" y cancela el handshake TLS si el respondedor de OCSP no está disponible. Otros sistemas operativos y drivers reportan una "falla leve" y continúan conectándose.
macOS
En macOS, el controlador .NET/C# admite OCSP y grapado de OCSP.
A partir de .NET Core,2.0 el controlador no admite CRL sin OCSP.
Linux
En Linux, el controlador .NET/C# admite OCSP, grapado OCSP y CRL sin OCSP.
Documentación de la API
Para obtener más información sobre cualquiera de las opciones de conexión analizadas en esta guía, consulte la siguiente documentación de API: