MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB SSL con certificati autofirmati in C#

Quando si distribuisce MongoDB in produzione, si consiglia vivamente di utilizzare una configurazione del set di repliche distribuita geograficamente abilitata per SSL per la massima sicurezza e disponibilità. ScaleGrid offre due opzioni per la configurazione di SSL.

Un'opzione è acquistare i tuoi certificati SSL firmati da CA e configurarli sul server MongoDB. Se la tua applicazione si connette al database di produzione su una rete pubblica, contatta [email protected] per saperne di più.

Ma per impostazione predefinita, configuriamo certificati autofirmati per SSL durante la creazione di nodi per un nuovo cluster. Ciò evita costi aggiuntivi e può essere ugualmente sicuro se configurato correttamente. Ma questo significa che il tuo driver MongoDB ha bisogno di aiuto per convalidare la catena di certificati.

Durante la gestione di certificati autofirmati, alcuni sviluppatori aggirano del tutto la convalida e compromettono seriamente la sicurezza! In questo post del blog, ti mostriamo due metodi per connetterti in modo sicuro a un server MongoDB configurato con certificati autofirmati per SSL, utilizzando il driver MongoDB ufficiale C#. Con pochi semplici passaggi, puoi fornire al tuo autista le informazioni necessarie per convalidare il certificato del server e mantenere la connessione sicura.

Come connettere MongoDB SSL alla tua applicazione C#Fai clic per twittare

Prerequisiti

Prima di procedere,

  • Assicurati che la tua applicazione possa connettersi alla tua distribuzione ScaleGrid. Fare riferimento al nostro documento della guida di MongoDB Connections per rivedere i passaggi generali per la connessione dell'applicazione a una distribuzione ScaleGrid.
  • È necessario che il driver MongoDB sia installato. Fare riferimento alla documentazione del driver MongoDB per rivedere i passaggi per l'installazione e l'utilizzo del C# MongoDB.Driver.

Nota:tutti gli esempi di codice sono stati testati utilizzando MongoDB Driver v2.8.1 insieme a .NET Framework v4.6.1. Tuttavia, dovrebbero funzionare su qualsiasi versione ragionevolmente recente di .NET Framework e driver MongoDB.

Ricordati di...

Modifica i percorsi dei file e gli URL di connessione negli esempi di codice nei tuoi percorsi e URL dei file. Altrimenti gli esempi di codice non funzioneranno. Consulta le parti in grassetto degli esempi di codice per sapere dove devi apportare modifiche. Ad esempio:

  • =C:\Utenti\Utente\Cartella\caCert.cer
  • =mongodb://admin:@SG-example.servers.example.com:27017

Metodo 1:aggiunta del certificato ScaleGrid a Windows Trust Store

Uno dei modi più semplici per utilizzare certificati autofirmati con C# e .NET Framework è aggiungere il certificato come "Radice attendibile" su Windows Trust Store. Ecco come puoi farlo:

  1. Scarica il certificato CA dall'interfaccia utente di ScaleGrid.
  2. Apri un prompt di PowerShell:se desideri aggiungere il certificato come root attendibile per tutti gli utenti, dovrai aprirlo in modalità amministrativa.
  3. Esegui il comando seguente oppure esegui questa operazione utilizzando Microsoft Management Console.:
    • Per aggiungere solo per l'utente corrente:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Da aggiungere per tutti:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Ecco fatto! Ora il certificato autofirmato supererà tutte le convalide predefinite e sei pronto per creare un client MongoDB.

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

Metodo 2:utilizzo della richiamata di convalida personalizzata

Ci sono due problemi con l'aggiunta del certificato ScaleGrid a Windows Trust Store:

  • Le impostazioni si applicano a tutti i programmi in esecuzione sulla macchina:questa può essere una vulnerabilità di sicurezza.
  • Questo deve essere fatto una volta per macchina. Se sposti il ​​tuo codice su un nuovo server, può improvvisamente smettere di funzionare. Questo lascia il metodo soggetto a errori umani.

Quindi, il modo consigliato per connettersi utilizzando certificati autofirmati consiste nell'utilizzare un callback di convalida personalizzato che verifica il certificato. Ecco come puoi farlo:

  1. Scarica il tuo certificato CA e salvalo in una posizione a cui può accedere la tua applicazione (questa sarà in genere la sua directory di dati).
  2. Dalla tua applicazione, puoi leggere questo certificato e abbinare quello che ricevi dal server MongoDB.
  3. In alternativa, puoi memorizzare un hash crittografico del certificato. Invece di leggere il certificato e la corrispondenza, puoi calcolare l'hash crittografico sul certificato ricevuto e abbinare i risultati.

Ecco un programma di esempio che ha il certificato CA archiviato nella sua directory bin con il nome caCert.cer. Stampa semplicemente un elenco di tutti i database che esistono sul server 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;
    }
  }
}

Risoluzione dei problemi

Se hai problemi a connetterti alla tua distribuzione MongoDB abilitata per SSL, ecco alcuni suggerimenti per il debug:

  • In primo luogo, verifica di poterti effettivamente connettere al server MongoDB dal server in cui è in esecuzione la tua applicazione. Il modo più semplice per farlo è installare mongo shell sul computer client. Su Linux, non avresti bisogno di installare l'intero server MongoDB:puoi scegliere di installare solo la shell. Una volta che la shell è disponibile, prova a utilizzare la "Sintassi della riga di comando" fornita per tentare di connetterti al server.
  • Se non riesci a connetterti tramite la shell mongo, significa che la macchina client non è in grado di raggiungere la porta 27017 dei server MongoDB. Esamina le impostazioni del tuo gruppo di sicurezza, VPC e/o firewall ScaleGrid per assicurarti che ci sia connettività tra le macchine client e server.
  • Se la connettività di rete è corretta, la prossima cosa da verificare è che stai utilizzando versioni di MongoDB Driver e .NET Framework compatibili con la versione del tuo server MongoDB.
  • Se hai confermato che le versioni del driver sono corrette, prova a eseguire un programma C# di esempio in modalità di debug, simile all'esempio fornito sopra. Un'esecuzione passo passo aiuterebbe a risolvere il problema.
  • Se riscontri ancora problemi di connessione alla tua istanza, contattaci all'indirizzo [email protected] con i risultati dettagliati della procedura di risoluzione dei problemi di cui sopra e con le versioni esatte di C# e del driver Mongo che stai utilizzando.

Se non conosci ScaleGrid e vuoi provare questo tutorial, registrati per una prova gratuita di 30 giorni per esplorare la piattaforma e provare a connettere MongoDB alla tua applicazione C# .