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

MongoDB SSL med selvsignerede certifikater i C#

Når du implementerer MongoDB i produktion, anbefales det kraftigt, at du bruger en SSL-aktiveret geo-distribueret replika-sæt-konfiguration for maksimal sikkerhed og tilgængelighed. ScaleGrid giver dig to muligheder for opsætning af SSL.

En mulighed er at købe dine egne CA-signerede SSL-certifikater og konfigurere dem på MongoDB-serveren. Hvis din applikation opretter forbindelse til produktionsdatabasen over et offentligt netværk, skal du kontakte [email protected] for at lære mere om dette.

Men som standard konfigurerer vi selvsignerede certifikater til SSL, når vi opretter noder til en ny klynge. Dette undgår ekstra omkostninger og kan være lige så sikkert, når det er konfigureret korrekt. Men det betyder, at din MongoDB-driver har brug for hjælp til at validere certifikatkæden.

Når de håndterer selvsignerede certifikater, omgår nogle udviklere validering fuldstændigt og kompromitterer alvorligt sikkerheden! I dette blogindlæg viser vi dig to metoder til sikker forbindelse til en MongoDB-server, der er konfigureret med selvsignerede certifikater til SSL, ved hjælp af den officielle C# MongoDB-driver. Med nogle få enkle trin kan du give din chauffør de oplysninger, den skal bruge for at validere servercertifikatet og holde forbindelsen sikker.

Sådan forbinder du MongoDB SSL til din C#-applikationKlik for at tweete

Forudsætninger

Før du fortsætter,

  • Sørg for, at din applikation kan oprette forbindelse til din ScaleGrid-implementering. Se venligst vores MongoDB Connections-hjælpedokument for at gennemgå de generelle trin for at forbinde din applikation til en ScaleGrid-implementering.
  • Du skal have MongoDB-driveren installeret. Se venligst MongoDB Driver-dokumenterne for at gennemgå trinene til installation og brug af C# MongoDB.Driver.

Bemærk:Alle kodeeksempler er blevet testet med MongoDB Driver v2.8.1 sammen med .NET Framework v4.6.1. De bør dog fungere på enhver rimeligt nyere version af .NET Framework og MongoDB Driver.

Husk at...

Rediger filstierne og forbindelses-URL'erne i kodeeksemplerne til dine egne filstier og URL'er. Ellers vil kodeeksemplerne ikke fungere. Se venligst de fede dele af kodeeksemplerne for, hvor du skal foretage ændringer. For eksempel:

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

Metode 1:Tilføjelse af ScaleGrid-certifikatet til Windows Trust Store

En af de enkleste måder at bruge selvsignerede certifikater på med C# og .NET Framework er at tilføje certifikatet som "Trusted Root" i Windows Trust Store. Sådan kan du gøre det:

  1. Download dit CA-certifikat fra ScaleGrid UI.
  2. Åbn en PowerShell-prompt – hvis du ønsker at tilføje certifikatet som betroet rod for alle brugere, skal du åbne det i administrativ tilstand.
  3. Udfør følgende kommando, eller gør dette ved hjælp af Microsoft Management Console.:
    • For kun at tilføje for den aktuelle bruger:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Sådan tilføjes for alle:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Det var det! Nu vil det selvsignerede certifikat bestå alle standardvalideringer, og du er klar til at oprette en MongoDB-klient.

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

Metode 2:Brug af tilpasset valideringstilbagekald

Der er to problemer med at tilføje ScaleGrid-certifikatet til Windows Trust Store:

  • Indstillingerne gælder for alle programmer, der kører på maskinen:dette kan være en sikkerhedssårbarhed.
  • Dette skal gøres én gang pr. maskine. Hvis du flytter din kode til en ny server, kan den pludselig holde op med at virke. Dette efterlader metoden udsat for menneskelige fejl.

Derfor er den anbefalede måde at forbinde ved hjælp af selvsignerede certifikater at bruge et tilpasset valideringstilbagekald, der verificerer certifikatet. Sådan kan du gøre dette:

  1. Download dit CA-certifikat, og gem det på et sted, som din applikation har adgang til (dette vil typisk være dets databibliotek).
  2. Fra din applikation kan du læse dette certifikat og matche det, du modtager fra MongoDB-serveren.
  3. Alternativt kan du gemme en kryptografisk hash af certifikatet. I stedet for at læse certifikatet og matche, kan du beregne den kryptografiske hash over det modtagne certifikat og matche resultaterne.

Her er et eksempelprogram, der har CA-certifikatet gemt under dets bin-mappe med navnet caCert.cer. Det udskriver simpelthen en liste over alle databaser, der findes på MongoDB-serveren:

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

Fejlfinding

Hvis du har problemer med at oprette forbindelse til din SSL-aktiverede MongoDB-implementering, er her et par tip til fejlretning:

  • Først skal du kontrollere, at du faktisk kan oprette forbindelse til MongoDB-serveren fra den server, hvor din applikation kører. Den nemmeste måde at gøre dette på er at installere mongo shell på klientmaskinen. På Linux behøver du ikke installere hele MongoDB-serveren - du kan vælge kun at installere skallen. Når shellen er tilgængelig, kan du prøve at bruge den 'Kommandolinjesyntaks', vi leverer, til at forsøge at oprette forbindelse til serveren.
  • Hvis du ikke er i stand til at oprette forbindelse via mongo-skallen, betyder det, at klientmaskinen ikke er i stand til at nå port 27017 på MongoDB-serverne. Se på dine sikkerhedsgruppe-, VPC- og/eller ScaleGrid-firewallindstillinger for at sikre, at der er forbindelse mellem klient- og servermaskinerne.
  • Hvis netværksforbindelsen er korrekt, er den næste ting at kontrollere, at du bruger versioner af MongoDB Driver og .NET Framework, der er kompatible med versionen af ​​din MongoDB-server.
  • Hvis du har bekræftet, at driverversionerne er korrekte, så prøv at køre et eksempel på et C#-program i fejlretningstilstand, svarende til eksemplet, vi gav ovenfor. En trin-for-trin udførelse ville hjælpe med at forårsage problemet.
  • Hvis du stadig har problemer med at oprette forbindelse til din instans, bedes du kontakte os på [email protected] med detaljerede resultater af ovenstående fejlfindingstrin og med de nøjagtige versioner af C# og den Mongo-driver, du bruger.

Hvis du er ny i ScaleGrid og vil prøve denne tutorial, kan du tilmelde dig en gratis 30-dages prøveperiode for at udforske platformen og teste at forbinde MongoDB til din C#-applikation .


  1. MongoDb:Forskel mellem $push/$addtoset

  2. spring data mongodb id felt mapping

  3. Mongo $i operatørydelse

  4. Håndtering af brugerdefineret BSON Marshaling