sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB SSL con certificados autofirmados en C#

Al implementar MongoDB en producción, se recomienda encarecidamente que utilice una configuración de conjunto de réplicas distribuidas geográficamente habilitada para SSL para obtener la máxima seguridad y disponibilidad. ScaleGrid le ofrece dos opciones para configurar SSL.

Una opción es comprar sus propios certificados SSL firmados por una CA y configurarlos en el servidor MongoDB. Si su aplicación se conecta a la base de datos de producción a través de una red pública, comuníquese con [email protected] para obtener más información al respecto.

Pero, de forma predeterminada, configuramos certificados autofirmados para SSL al crear nodos para un nuevo clúster. Esto evita costos adicionales y puede ser igualmente seguro cuando se configura correctamente. Pero esto significa que su controlador MongoDB necesita ayuda para validar la cadena de certificados.

Cuando manejan certificados autofirmados, algunos desarrolladores eluden la validación por completo y comprometen seriamente la seguridad. En esta publicación de blog, le mostramos dos métodos para conectarse de forma segura a un servidor MongoDB configurado con certificados autofirmados para SSL, utilizando el controlador oficial C# MongoDB. Con unos sencillos pasos, puede proporcionar a su conductor la información que necesita para validar el certificado del servidor y mantener la conexión segura.

Cómo conectar MongoDB SSL a su aplicación C#Haga clic para twittear

Requisitos previos

Antes de continuar,

  • Asegúrese de que su aplicación pueda conectarse a su implementación de ScaleGrid. Consulte nuestro documento de ayuda de MongoDB Connections para revisar los pasos generales para conectar su aplicación a una implementación de ScaleGrid.
  • Debe tener instalado el controlador MongoDB. Consulte los documentos del controlador MongoDB para revisar los pasos para instalar y usar C# MongoDB.Driver.

Nota:Todos los ejemplos de código se probaron con MongoDB Driver v2.8.1 junto con .NET Framework v4.6.1. Sin embargo, deberían funcionar en cualquier versión razonablemente reciente de .NET Framework y MongoDB Driver.

Recuerda...

Modifique las rutas de archivo y las URL de conexión en los ejemplos de código a sus propias rutas de archivo y URL. De lo contrario, los ejemplos de código no funcionarán. Consulte las partes en negrita de los ejemplos de código para saber dónde debe realizar cambios. Por ejemplo:

  • =C:\Usuarios\Usuario\Carpeta\caCert.cer
  • =mongodb://admin:@SG-example.servers.example.com:27017

Método 1:agregar el certificado de ScaleGrid al almacén de confianza de Windows

Una de las formas más sencillas de usar certificados autofirmados con C# y .NET Framework es agregar el certificado como "raíz de confianza" en Windows Trust Store. Así es como puedes hacerlo:

  1. Descargue su certificado de CA desde la interfaz de usuario de ScaleGrid.
  2. Abra un indicador de PowerShell:si desea agregar el certificado como raíz de confianza para todos los usuarios, deberá abrirlo en modo administrativo.
  3. Ejecute el siguiente comando, o hágalo usando Microsoft Management Console.:
    • Para agregar solo para el usuario actual:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Para agregar para todos:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

¡Eso es todo! Ahora el certificado autofirmado pasará todas las validaciones predeterminadas y estará listo para crear un cliente MongoDB.

var connURL = "mongodb://admin:<password>@<host1>,<host2>:27017/admin?replicaSet=<ReplicaSetName>&ssl=true";
var client = new MongoClient(connURL);

Método 2:Uso de devolución de llamada de validación personalizada

Hay dos problemas al agregar el certificado ScaleGrid al almacén de confianza de Windows:

  • La configuración se aplica a todos los programas que se ejecutan en la máquina:esto puede ser una vulnerabilidad de seguridad.
  • Esto debe hacerse una vez por máquina. Si mueve su código a un nuevo servidor, puede dejar de funcionar repentinamente. Esto deja al método propenso a errores humanos.

Por lo tanto, la forma recomendada de conectarse mediante certificados autofirmados es utilizar una devolución de llamada de validación personalizada que verifique el certificado. Así es como puedes hacer esto:

  1. Descargue su certificado de CA y guárdelo en una ubicación a la que pueda acceder su aplicación (normalmente será su directorio de datos).
  2. Desde su aplicación, puede leer este certificado y hacer coincidir el que recibe del servidor MongoDB.
  3. Como alternativa, puede almacenar un hash criptográfico del certificado. En lugar de leer el certificado y hacer coincidir, puede calcular el hash criptográfico sobre el certificado recibido y hacer coincidir los resultados.

Aquí hay un programa de muestra que tiene el certificado de CA almacenado en su directorio bin con el nombre caCert.cer. Simplemente imprime una lista de todas las bases de datos que existen en el servidor MongoDB:

using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace TestMongoDB
{
  class Program
  {
    static void Main(string[] args)
    {
      var connURL = "mongodb:<password>//admin:@<host1>,<host2>:27017/admin?replicaSet=<Replica-Set-Name>&ssl=true";
      var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connURL));
      clientSettings.UseSsl = true;
      clientSettings.VerifySslCertificate = true;
      clientSettings.SslSettings = new SslSettings();
      clientSettings.SslSettings.ServerCertificateValidationCallback = ValidateServerCertficate;
      var client = new MongoClient(clientSettings);
      using (IAsyncCursor cursor = client.ListDatabases())
      {
        while (cursor.MoveNext())
        {
          foreach (var doc in cursor.Current)
          {
            Console.WriteLine(doc["name"]); // database name
          }
        }
      }
    }

    private static bool ValidateServerCertficate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
      bool certMatch = false; // Assume failure
      switch(sslPolicyErrors)
      {
        case SslPolicyErrors.None:
          Console.WriteLine("No validation errors - accepting certificate");
          certMatch = true;
          break;
        case SslPolicyErrors.RemoteCertificateChainErrors:
          Console.WriteLine("Failed to validate certificate chain. Most likely a self-signed certificate");
          if (chain.ChainElements.Count == 1 && chain.ChainStatus[0].Status == X509ChainStatusFlags.UntrustedRoot) //It is a self-signed certificate, so chain length will be 1.
          {
            X509Certificate savedCert = X509Certificate.CreateFromCertFile("caCert.cer");
            if (savedCert.Equals(cert)) //This verifies that the issuer and serial number matches. You can also use a cryptographic hash, or match the two certificates byte by byte.
            {
              Console.WriteLine("The certificates match");
              certMatch = true;
            }
          }
          break;
        default:
          Console.WriteLine("Name mismatch or remote-cert not available. Rejecting connection");
          break;
      }
      return certMatch;
    }
  }
}

Resolución de problemas

Si tiene problemas para conectarse a su implementación de MongoDB compatible con SSL, aquí hay algunos consejos para la depuración:

  • Primero, verifique que realmente pueda conectarse al servidor MongoDB desde el servidor donde se ejecuta su aplicación. La forma más sencilla de hacer esto es instalar mongo shell en la máquina cliente. En Linux, no necesitaría instalar todo el servidor MongoDB; puede optar por instalar solo el shell. Una vez que el shell esté disponible, intente usar la "Sintaxis de la línea de comandos" que proporcionamos para intentar conectarse al servidor.
  • Si no puede conectarse a través del shell mongo, significa que la máquina cliente no puede conectarse al puerto 27017 de los servidores MongoDB. Mire la configuración del firewall de su grupo de seguridad, VPC y/o ScaleGrid para asegurarse de que haya conectividad entre las máquinas cliente y servidor.
  • Si la conectividad de la red es correcta, lo siguiente que debe comprobar es que está utilizando versiones de MongoDB Driver y .NET Framework que sean compatibles con la versión de su servidor MongoDB.
  • Si ha confirmado que las versiones del controlador son correctas, intente ejecutar un programa C# de muestra en modo de depuración, similar al ejemplo que proporcionamos anteriormente. Una ejecución paso a paso ayudaría a la raíz del problema.
  • Si todavía tiene problemas para conectarse a su instancia, comuníquese con nosotros a [email protected] con los resultados detallados de los pasos de solución de problemas anteriores y con las versiones exactas de C# y el controlador Mongo que está utilizando.

Si es nuevo en ScaleGrid y quiere probar este tutorial, regístrese para una prueba gratuita de 30 días para explorar la plataforma y probar la conexión de MongoDB a su aplicación C# .