sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB SSL med självsignerade certifikat i C#

När du distribuerar MongoDB i produktion, rekommenderas det starkt att du använder en SSL-aktiverad geo-distribuerad replika-set-konfiguration för maximal säkerhet och tillgänglighet. ScaleGrid ger dig två alternativ för att ställa in SSL.

Ett alternativ är att köpa dina egna CA-signerade SSL-certifikat och konfigurera dem på MongoDB-servern. Om din applikation ansluter till produktionsdatabasen över ett offentligt nätverk, kontakta [email protected] för att lära dig mer om detta.

Men som standard konfigurerar vi självsignerade certifikat för SSL när vi skapar noder för ett nytt kluster. Detta undviker extra kostnader och kan vara lika säkert när det är korrekt konfigurerat. Men detta betyder att din MongoDB-drivrutin behöver lite hjälp för att validera certifikatkedjan.

När de hanterar självsignerade certifikat, kringgår vissa utvecklare validering helt och hållet och äventyrar säkerheten allvarligt! I det här blogginlägget visar vi dig två metoder för att säkert ansluta till en MongoDB-server konfigurerad med självsignerade certifikat för SSL, med den officiella C# MongoDB-drivrutinen. Med några enkla steg kan du ge din förare den information den behöver för att validera servercertifikatet och hålla anslutningen säker.

Hur man ansluter MongoDB SSL till din C#-applikationKlicka för att tweeta

Förutsättningar

Innan du fortsätter,

  • Se till att din applikation kan ansluta till din ScaleGrid-distribution. Se vårt hjälpdokument för MongoDB Connections för att granska de allmänna stegen för att ansluta din applikation till en ScaleGrid-distribution.
  • Du måste ha MongoDB-drivrutinen installerad. Se MongoDB Driver-dokumentationen för att granska stegen för att installera och använda C# MongoDB.Driver.

Obs! Alla kodexempel har testats med MongoDB Driver v2.8.1 tillsammans med .NET Framework v4.6.1. De bör dock fungera på vilken som helst tämligen ny version av .NET Framework och MongoDB Driver.

Kom ihåg att...

Ändra filsökvägarna och anslutningsadresserna i kodexemplen till dina egna sökvägar och webbadresser. Annars fungerar inte kodexemplen. Se de fetstilta delarna av kodexemplen för var du behöver göra ändringar. Till exempel:

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

Metod 1:Lägga till ScaleGrid-certifikatet i Windows Trust Store

Ett av de enklaste sätten att använda självsignerade certifikat med C# och .NET Framework är att lägga till certifikatet som "Trusted Root" i Windows Trust Store. Så här kan du göra det:

  1. Ladda ner ditt CA-certifikat från ScaleGrid-gränssnittet.
  2. Öppna en PowerShell-prompt – om du vill lägga till certifikatet som betrodd rot för alla användare måste du öppna det i administrativt läge.
  3. Kör följande kommando, eller gör detta med hjälp av Microsoft Management Console.:
    • För att lägga till endast för den aktuella användaren:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Så här lägger du till för alla:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Det är allt! Nu kommer det självsignerade certifikatet att klara alla standardvalideringar och du är redo att skapa en MongoDB-klient.

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

Metod 2:Använda anpassad valideringsåteruppringning

Det finns två problem med att lägga till ScaleGrid-certifikatet till Windows Trust Store:

  • Inställningarna gäller för alla program som körs på maskinen:detta kan vara en säkerhetsrisk.
  • Detta måste göras en gång per maskin. Om du flyttar din kod till en ny server kan den plötsligt sluta fungera. Detta gör att metoden är utsatt för mänskliga fel.

Därför är det rekommenderade sättet att ansluta med självsignerade certifikat att använda en anpassad valideringsåteruppringning som verifierar certifikatet. Så här gör du:

  1. Ladda ner ditt CA-certifikat och spara det på en plats som din applikation kan komma åt (detta kommer vanligtvis att vara dess datakatalog).
  2. Från din applikation kan du läsa detta certifikat och matcha det du får från MongoDB-servern.
  3. Alternativt kan du lagra en kryptografisk hash för certifikatet. Istället för att läsa certifikatet och matcha kan du beräkna den kryptografiska hashen över det mottagna certifikatet och matcha resultaten.

Här är ett exempelprogram som har CA-certifikatet lagrat under sin bin-katalog med namnet caCert.cer. Den skriver helt enkelt ut en lista över alla databaser som finns på MongoDB Server:

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

Felsökning

Om du har problem med att ansluta till din SSL-aktiverade MongoDB-distribution, här är några tips för felsökning:

  • Verifiera först att du faktiskt kan ansluta till MongoDB-servern från servern där din applikation körs. Det enklaste sättet att göra detta är att installera mongo shell på klientdatorn. På Linux skulle du inte behöva installera hela MongoDB-servern - du kan välja att installera bara skalet. När skalet är tillgängligt, försök att använda "Kommandoradssyntaxen" som vi tillhandahåller för att försöka ansluta till servern.
  • Om du inte kan ansluta via mongo-skalet betyder det att klientdatorn inte kan nå port 27017 på MongoDB-servrarna. Titta på brandväggsinställningarna för säkerhetsgrupp, VPC och/eller ScaleGrid för att säkerställa att det finns anslutning mellan klient- och serverdatorerna.
  • Om nätverksanslutningen är korrekt är nästa sak att kontrollera att du använder versioner av MongoDB Driver och .NET Framework som är kompatibla med versionen av din MongoDB-server.
  • Om du har bekräftat att drivrutinsversionerna är korrekta, försök att köra ett exempel på C#-program i felsökningsläge, liknande exemplet vi gav ovan. En steg-för-steg-körning skulle hjälpa till att orsaka problemet.
  • Om du fortfarande har problem med att ansluta till din instans, vänligen kontakta oss på [email protected] med detaljerade resultat av ovanstående felsökningssteg och med de exakta versionerna av C# och Mongo-drivrutinen du använder.

Om du är ny på ScaleGrid och vill ge den här handledningen ett försök, registrera dig för en gratis 30-dagars provperiod för att utforska plattformen och testa att ansluta MongoDB till din C#-applikation .


  1. Hur man installerar MongoDB

  2. Redis prestanda på en multi-core CPU

  3. Hur kan jag använda Python för att omvandla MongoDB:s bsondump till JSON?

  4. Hur byter man namn på en MongoDB-databas?