MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB SSL mit selbstsignierten Zertifikaten in C#

Bei der Bereitstellung von MongoDB in der Produktion wird dringend empfohlen, für maximale Sicherheit und Verfügbarkeit eine SSL-fähige Konfiguration mit geografisch verteilten Replikatsätzen zu verwenden. ScaleGrid bietet Ihnen zwei Optionen zum Einrichten von SSL.

Eine Möglichkeit besteht darin, Ihre eigenen CA-signierten SSL-Zertifikate zu erwerben und sie auf dem MongoDB-Server zu konfigurieren. Wenn Ihre Anwendung über ein öffentliches Netzwerk eine Verbindung zur Produktionsdatenbank herstellt, wenden Sie sich an [email protected], um mehr darüber zu erfahren.

Aber standardmäßig konfigurieren wir selbstsignierte Zertifikate für SSL, wenn wir Knoten für einen neuen Cluster erstellen. Das vermeidet Mehrkosten und kann bei richtiger Konfiguration ebenso sicher sein. Dies bedeutet jedoch, dass Ihr MongoDB-Treiber etwas Hilfe benötigt, um die Zertifikatskette zu validieren.

Beim Umgang mit selbstsignierten Zertifikaten umgehen einige Entwickler die Validierung insgesamt und gefährden die Sicherheit ernsthaft! In diesem Blogbeitrag zeigen wir Ihnen zwei Methoden, um mithilfe des offiziellen C#-MongoDB-Treibers eine sichere Verbindung zu einem MongoDB-Server herzustellen, der mit selbstsignierten Zertifikaten für SSL konfiguriert ist. Mit ein paar einfachen Schritten können Sie Ihrem Treiber die Informationen zur Verfügung stellen, die er benötigt, um das Serverzertifikat zu validieren und die Verbindung sicher zu halten.

So verbinden Sie MongoDB SSL mit Ihrer C#-AnwendungClick To Tweet

Voraussetzungen

Bevor Sie fortfahren,

  • Stellen Sie sicher, dass Ihre Anwendung eine Verbindung zu Ihrer ScaleGrid-Bereitstellung herstellen kann. In unserem Hilfedokument zu MongoDB-Verbindungen finden Sie die allgemeinen Schritte zum Verbinden Ihrer Anwendung mit einer ScaleGrid-Bereitstellung.
  • Der MongoDB-Treiber muss installiert sein. Bitte lesen Sie die MongoDB-Treiberdokumentation, um die Schritte zum Installieren und Verwenden des C#-MongoDB.Driver zu überprüfen.

Hinweis:Alle Codebeispiele wurden mit dem MongoDB-Treiber v2.8.1 zusammen mit .NET Framework v4.6.1 getestet. Sie sollten jedoch auf allen halbwegs aktuellen Versionen von .NET Framework und MongoDB-Treiber funktionieren.

Denken Sie daran…

Ändern Sie die Dateipfade und Verbindungs-URLs in den Codebeispielen in Ihre eigenen Dateipfade und URLs. Andernfalls funktionieren die Codebeispiele nicht. Bitte sehen Sie sich die fettgedruckten Teile der Codebeispiele an, wo Sie Änderungen vornehmen müssen. Zum Beispiel:

  • =C:\Benutzer\Benutzer\Ordner\caCert.cer
  • =mongodb://admin:@SG-example.servers.example.com:27017

Methode 1:Hinzufügen des ScaleGrid-Zertifikats zum Windows Trust Store

Eine der einfachsten Möglichkeiten, selbstsignierte Zertifikate mit C# und dem .NET Framework zu verwenden, besteht darin, das Zertifikat als „Vertrauenswürdiger Stamm“ im Windows Trust Store hinzuzufügen. So geht's:

  1. Laden Sie Ihr CA-Zertifikat von der ScaleGrid-Benutzeroberfläche herunter.
  2. Öffnen Sie eine PowerShell-Eingabeaufforderung – wenn Sie das Zertifikat als vertrauenswürdiges Stammverzeichnis für alle Benutzer hinzufügen möchten, müssen Sie es im Administratormodus öffnen.
  3. Führen Sie den folgenden Befehl aus oder verwenden Sie die Microsoft Management Console.:
    • Um nur für den aktuellen Benutzer hinzuzufügen:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Für alle hinzufügen:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Das war's! Jetzt besteht das selbstsignierte Zertifikat alle Standardvalidierungen und Sie können einen MongoDB-Client erstellen.

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

Methode 2:Verwenden von benutzerdefiniertem Validierungs-Callback

Es gibt zwei Probleme beim Hinzufügen des ScaleGrid-Zertifikats zum Windows Trust Store:

  • Die Einstellungen gelten für alle Programme, die auf dem Computer ausgeführt werden:Dies kann eine Sicherheitslücke sein.
  • Dies muss einmal pro Maschine durchgeführt werden. Wenn Sie Ihren Code auf einen neuen Server verschieben, kann er plötzlich nicht mehr funktionieren. Dadurch ist die Methode anfällig für menschliche Fehler.

Daher ist die empfohlene Methode zum Herstellen einer Verbindung mit selbstsignierten Zertifikaten die Verwendung eines benutzerdefinierten Validierungsrückrufs, der das Zertifikat überprüft. So können Sie das tun:

  1. Laden Sie Ihr CA-Zertifikat herunter und speichern Sie es an einem Ort, auf den Ihre Anwendung zugreifen kann (dies ist normalerweise das Datenverzeichnis).
  2. In Ihrer Anwendung können Sie dieses Zertifikat lesen und mit dem Zertifikat abgleichen, das Sie vom MongoDB-Server erhalten.
  3. Alternativ können Sie einen kryptografischen Hash des Zertifikats speichern. Anstatt das Zertifikat zu lesen und abzugleichen, können Sie den kryptografischen Hash über das empfangene Zertifikat berechnen und die Ergebnisse abgleichen.

Hier ist ein Beispielprogramm, in dem das CA-Zertifikat unter dem bin-Verzeichnis mit dem Namen caCert.cer gespeichert ist. Es druckt einfach eine Liste aller Datenbanken, die auf dem MongoDB-Server vorhanden sind:

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;
    }
  }
}

Fehlerbehebung

Wenn Sie Probleme haben, eine Verbindung zu Ihrer SSL-fähigen MongoDB-Bereitstellung herzustellen, finden Sie hier einige Tipps zum Debuggen:

  • Vergewissern Sie sich zunächst, dass Sie von dem Server, auf dem Ihre Anwendung ausgeführt wird, tatsächlich eine Verbindung zum MongoDB-Server herstellen können. Der einfachste Weg, dies zu tun, besteht darin, die Mongo-Shell auf dem Client-Computer zu installieren. Unter Linux müssten Sie nicht den gesamten MongoDB-Server installieren – Sie können auch nur die Shell installieren. Sobald die Shell verfügbar ist, versuchen Sie, die von uns bereitgestellte „Befehlszeilensyntax“ zu verwenden, um zu versuchen, eine Verbindung zum Server herzustellen.
  • Wenn Sie keine Verbindung über die Mongo-Shell herstellen können, bedeutet dies, dass der Client-Computer den Port 27017 der MongoDB-Server nicht erreichen kann. Überprüfen Sie Ihre Sicherheitsgruppen-, VPC- und/oder ScaleGrid-Firewalleinstellungen, um sicherzustellen, dass eine Verbindung zwischen den Client- und Servercomputern besteht.
  • Wenn die Netzwerkkonnektivität korrekt ist, müssen Sie als Nächstes überprüfen, ob Sie Versionen von MongoDB-Treiber und .NET Framework verwenden, die mit der Version Ihres MongoDB-Servers kompatibel sind.
  • Wenn Sie bestätigt haben, dass die Treiberversionen korrekt sind, versuchen Sie, ein C#-Beispielprogramm im Debug-Modus auszuführen, ähnlich dem oben bereitgestellten Beispiel. Eine schrittweise Ausführung würde helfen, das Problem zu beheben.
  • Wenn Sie immer noch Probleme haben, sich mit Ihrer Instanz zu verbinden, wenden Sie sich bitte unter [email protected] an uns und teilen Sie uns die detaillierten Ergebnisse der oben genannten Schritte zur Fehlerbehebung und die genauen Versionen von C# und dem von Ihnen verwendeten Mongo-Treiber mit.
  • li>

Wenn Sie neu bei ScaleGrid sind und dieses Tutorial ausprobieren möchten, melden Sie sich für eine kostenlose 30-Tage-Testversion an, um die Plattform zu erkunden und die Verbindung von MongoDB mit Ihrer C#-Anwendung zu testen .