sql >> Database >  >> NoSQL >> MongoDB

MongoDB SSL met zelfondertekende certificaten in C#

Bij het implementeren van MongoDB in productie, wordt het ten zeerste aanbevolen om een ​​SSL-enabled geo-gedistribueerde replica-set configuratie te gebruiken voor maximale veiligheid en beschikbaarheid. ScaleGrid biedt u twee opties voor het instellen van SSL.

Een optie is om uw eigen CA-ondertekende SSL-certificaten aan te schaffen en deze te configureren op de MongoDB-server. Als uw toepassing verbinding maakt met de productiedatabase via een openbaar netwerk, neem dan contact op met [email protected] voor meer informatie hierover.

Maar standaard configureren we zelfondertekende certificaten voor SSL bij het maken van nodes voor een nieuw cluster. Dit voorkomt extra kosten en kan net zo veilig zijn als het correct is geconfigureerd. Maar dit betekent wel dat uw MongoDB-stuurprogramma wat hulp nodig heeft om de certificaatketen te valideren.

Bij het verwerken van zelfondertekende certificaten omzeilen sommige ontwikkelaars de validatie helemaal en brengen ze de veiligheid ernstig in gevaar! In deze blogpost laten we je twee methoden zien om veilig verbinding te maken met een MongoDB-server die is geconfigureerd met zelfondertekende certificaten voor SSL, met behulp van de officiële C# MongoDB-driver. Met een paar eenvoudige stappen kunt u uw chauffeur de informatie geven die hij nodig heeft om het servercertificaat te valideren en de verbinding veilig te houden.

MongoDB SSL verbinden met uw C#-toepassingKlik om te tweeten

Vereisten

Voordat u verder gaat,

  • Zorg ervoor dat uw toepassing verbinding kan maken met uw ScaleGrid-implementatie. Raadpleeg ons MongoDB Connections-helpdocument om de algemene stappen te bekijken voor het verbinden van uw applicatie met een ScaleGrid-implementatie.
  • Je moet het MongoDB-stuurprogramma hebben geïnstalleerd. Raadpleeg de MongoDB Driver-documenten om de stappen voor het installeren en gebruiken van de C# MongoDB.Driver te bekijken.

Opmerking:alle codevoorbeelden zijn getest met MongoDB Driver v2.8.1 samen met .NET Framework v4.6.1. Ze zouden echter moeten werken met elke redelijk recente versie van .NET Framework en MongoDB Driver.

Vergeet niet om...

Wijzig de bestandspaden en verbindings-URL's in de codevoorbeelden in uw eigen bestandspaden en URL's. Anders werken de codevoorbeelden niet. Zie de vetgedrukte delen van de codevoorbeelden om te zien waar u wijzigingen moet aanbrengen. Bijvoorbeeld:

  • =C:\Users\User\Folder\caCert.cer
  • =mongodb://admin:@SG-example.servers.example.com:27017

Methode 1:Het ScaleGrid-certificaat toevoegen aan Windows Trust Store

Een van de eenvoudigste manieren om zelfondertekende certificaten te gebruiken met C# en het .NET Framework is het toevoegen van het certificaat als "Trusted Root" in de Windows Trust Store. Zo kunt u het doen:

  1. Download uw CA-certificaat van de ScaleGrid-gebruikersinterface.
  2. Open een PowerShell-prompt – als u het certificaat als vertrouwde root voor alle gebruikers wilt toevoegen, moet u het openen in de beheerdersmodus.
  3. Voer de volgende opdracht uit of gebruik de Microsoft Management Console.:
    • Alleen toevoegen voor de huidige gebruiker:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Toevoegen voor iedereen:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Dat is het! Nu doorstaat het zelfondertekende certificaat alle standaardvalidaties en bent u klaar om een ​​MongoDB-client te maken.

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

Methode 2:Aangepaste validatie-callback gebruiken

Er zijn twee problemen met het toevoegen van het ScaleGrid-certificaat aan de Windows Trust Store:

  • De instellingen zijn van toepassing op alle programma's die op de machine draaien:dit kan een beveiligingslek zijn.
  • Dit moet één keer per machine worden gedaan. Als u uw code naar een nieuwe server verplaatst, kan deze plotseling stoppen met werken. Dit maakt de methode vatbaar voor menselijke fouten.

Daarom is de aanbevolen manier om verbinding te maken met behulp van zelfondertekende certificaten het gebruik van een aangepaste validatie-callback die het certificaat verifieert. Hier leest u hoe u dit kunt doen:

  1. Download uw CA-certificaat en sla het op een locatie op waartoe uw toepassing toegang heeft (dit is meestal de gegevensmap).
  2. Vanuit uw toepassing kunt u dit certificaat lezen en overeenkomen met het certificaat dat u van de MongoDB-server ontvangt.
  3. Als alternatief kunt u een cryptografische hash van het certificaat opslaan. In plaats van het certificaat te lezen en te matchen, kunt u de cryptografische hash over het ontvangen certificaat berekenen en de resultaten matchen.

Hier is een voorbeeldprogramma waarin het CA-certificaat is opgeslagen onder de bin-directory met de naam caCert.cer. Het drukt gewoon een lijst af van alle databases die op de MongoDB-server bestaan:

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

Problemen oplossen

Als je problemen hebt om verbinding te maken met je SSL-enabled MongoDB-implementatie, volgen hier een paar tips voor het opsporen van fouten:

  • Controleer eerst of u daadwerkelijk verbinding kunt maken met de MongoDB-server vanaf de server waarop uw toepassing draait. De eenvoudigste manier om dit te doen, is door mongo-shell op de clientcomputer te installeren. Op Linux hoeft u niet de hele MongoDB-server te installeren - u kunt ervoor kiezen om alleen de shell te installeren. Zodra de shell beschikbaar is, probeert u de 'Command Line Syntax' die we bieden te gebruiken om te proberen verbinding te maken met de server.
  • Als je geen verbinding kunt maken via de mongo-shell, betekent dit dat de clientcomputer poort 27017 van de MongoDB-servers niet kan bereiken. Kijk naar de instellingen van uw Security Group, VPC en/of ScaleGrid-firewall om er zeker van te zijn dat er verbinding is tussen de client- en servermachines.
  • Als de netwerkverbinding correct is, is het volgende dat u moet controleren, dat u versies van MongoDB Driver en .NET Framework gebruikt die compatibel zijn met de versie van uw MongoDB-server.
  • Als je hebt bevestigd dat de stuurprogrammaversies correct zijn, probeer dan een voorbeeld van een C#-programma in debug-modus, vergelijkbaar met het voorbeeld dat we hierboven hebben gegeven. Een stapsgewijze uitvoering zou de oorzaak van het probleem kunnen zijn.
  • Als je nog steeds problemen hebt om verbinding te maken met je instantie, neem dan contact met ons op via [email protected] met gedetailleerde resultaten van de bovenstaande stappen voor probleemoplossing en met de exacte versies van C# en het Mongo-stuurprogramma dat je gebruikt.
  • li>

Als u nieuw bent bij ScaleGrid en deze tutorial wilt proberen, meld u dan aan voor een gratis proefperiode van 30 dagen om het platform te verkennen en te testen hoe u MongoDB met uw C#-toepassing verbindt .


  1. Redis-interacties in javascript stoppen met Sinon

  2. Hoe het type van een veld wijzigen?

  3. Wat is de standaardcachestrategie bij gebruik van Redis met spring of springboot?

  4. Redis diff tussen twee lijsten?