sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB SSL s certifikáty s vlastním podpisem v C#

Při nasazování MongoDB do produkce se důrazně doporučuje použít konfiguraci geograficky distribuované sady replik s povoleným SSL pro maximální zabezpečení a dostupnost. ScaleGrid vám nabízí dvě možnosti nastavení SSL.

Jednou možností je zakoupení vlastních certifikátů SSL podepsaných CA a jejich konfigurace na serveru MongoDB. Pokud se vaše aplikace připojuje k produkční databázi prostřednictvím veřejné sítě, obraťte se na [email protected], kde se o tom dozvíte více.

Při vytváření uzlů pro nový cluster však standardně konfigurujeme certifikáty s vlastním podpisem pro SSL. Vyhnete se tak dodatečným nákladům a při správné konfiguraci může být stejně bezpečná. To však znamená, že váš ovladač MongoDB potřebuje pomoc s ověřením řetězce certifikátů.

Při práci s certifikáty podepsanými sebou samým někteří vývojáři obcházejí validaci a vážně ohrožují bezpečnost! V tomto blogovém příspěvku vám ukážeme dva způsoby, jak se bezpečně připojit k serveru MongoDB nakonfigurovanému s certifikáty s vlastním podpisem pro SSL pomocí oficiálního ovladače C# MongoDB. Pomocí několika jednoduchých kroků můžete svému ovladači poskytnout informace, které potřebuje k ověření certifikátu serveru a zabezpečení připojení.

Jak připojit MongoDB SSL k vaší aplikaci C#Click To Tweet

Předpoklady

Než budete pokračovat,

  • Ujistěte se, že se vaše aplikace může připojit k vašemu nasazení ScaleGrid. Obecné kroky pro připojení vaší aplikace k nasazení ScaleGrid najdete v našem dokumentu nápovědy MongoDB Connections.
  • Musíte mít nainstalovaný ovladač MongoDB. Pokyny pro instalaci a používání C# MongoDB.Driver naleznete v dokumentaci k ovladači MongoDB.

Poznámka:Všechny ukázky kódu byly testovány pomocí ovladače MongoDB v2.8.1 spolu s .NET Framework v4.6.1. Měly by však fungovat na jakékoli přiměřeně nejnovější verzi rozhraní .NET Framework a ovladače MongoDB.

Nezapomeňte…

Upravte cesty k souborům a adresy URL připojení v ukázkách kódu na své vlastní cesty k souborům a adresy URL. Jinak ukázky kódu nebudou fungovat. Podívejte se prosím na tučné části ukázek kódu, kde je potřeba provést změny. Například:

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

Metoda 1:Přidání certifikátu ScaleGrid do úložiště Windows Trust Store

Jedním z nejjednodušších způsobů použití certifikátů s vlastním podpisem v C# a .NET Framework je přidání certifikátu jako „Trusted Root“ do Windows Trust Store. Můžete to udělat takto:

  1. Stáhněte si certifikát CA z uživatelského rozhraní ScaleGrid.
  2. Otevřete výzvu PowerShellu – pokud chcete přidat certifikát jako důvěryhodný kořen pro všechny uživatele, budete jej muset otevřít v režimu správy.
  3. Proveďte následující příkaz nebo to proveďte pomocí konzoly Microsoft Management Console.:
    • Chcete-li přidat pouze pro aktuálního uživatele:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Chcete-li přidat pro všechny:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

To je ono! Certifikát s vlastním podpisem nyní projde všemi výchozími ověřeními a vy jste připraveni vytvořit klienta MongoDB.

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

Metoda 2:Použití zpětného volání pro vlastní ověření

Při přidávání certifikátu ScaleGrid do úložiště Windows Trust Store existují dva problémy:

  • Nastavení platí pro všechny programy spuštěné na počítači:může se jednat o bezpečnostní chybu.
  • Toto je třeba provést jednou pro každý počítač. Pokud svůj kód přesunete na nový server, může náhle přestat fungovat. Díky tomu je metoda náchylná k lidské chybě.

Doporučeným způsobem připojení pomocí certifikátů s vlastním podpisem je tedy použití vlastního zpětného volání ověření, které certifikát ověří. Můžete to udělat takto:

  1. Stáhněte si certifikát CA a uložte jej na místo, kam má vaše aplikace přístup (obvykle to bude její datový adresář).
  2. Ve své aplikaci si můžete přečíst tento certifikát a shodovat se s certifikátem, který jste obdrželi ze serveru MongoDB.
  3. Případně můžete uložit kryptografický hash certifikátu. Namísto čtení certifikátu a porovnávání můžete vypočítat kryptografický hash z přijatého certifikátu a porovnat výsledky.

Zde je ukázkový program, který má certifikát CA uložený v adresáři bin s názvem caCert.cer. Jednoduše vytiskne seznam všech databází, které existují na serveru 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;
    }
  }
}

Odstraňování problémů

Pokud máte potíže s připojením k nasazení MongoDB s povoleným SSL, zde je několik tipů pro ladění:

  • Nejprve ověřte, že se skutečně můžete připojit k serveru MongoDB ze serveru, na kterém běží vaše aplikace. Nejjednodušší způsob, jak toho dosáhnout, je nainstalovat mongo shell na klientský počítač. V systému Linux byste nemuseli instalovat celý server MongoDB – můžete se rozhodnout nainstalovat pouze shell. Jakmile bude shell k dispozici, zkuste se pokusit připojit k serveru pomocí „syntaxe příkazového řádku“, kterou poskytujeme.
  • Pokud se nemůžete připojit přes mongo shell, znamená to, že klientský počítač nemůže dosáhnout portu 27017 serverů MongoDB. Podívejte se na nastavení firewallu Security Group, VPC a/nebo ScaleGrid, abyste se ujistili, že mezi klientskými a serverovými počítači existuje konektivita.
  • Pokud je připojení k síti správné, další věcí, kterou je třeba zkontrolovat, je, že používáte verze ovladače MongoDB a rozhraní .NET Framework, které jsou kompatibilní s verzí vašeho serveru MongoDB.
  • Pokud jste potvrdili, že verze ovladače jsou správné, zkuste spustit ukázkový program C# v režimu ladění, podobný příkladu, který jsme uvedli výše. Spuštění krok za krokem by pomohlo vyřešit příčinu problému.
  • Pokud máte stále potíže s připojením ke své instanci, kontaktujte nás na adrese [email protected] s podrobnými výsledky výše uvedených kroků pro odstraňování problémů a s přesnou verzí C# a ovladače Mongo, které používáte.
  • li>

Pokud jste ve ScaleGrid noví a chcete si tento tutoriál vyzkoušet, přihlaste se k bezplatné 30denní zkušební verzi, abyste mohli prozkoumat platformu a otestovat připojení MongoDB k vaší aplikaci C# .


  1. StackExchange.Redis - Použití LockTake / LockRelease

  2. Nelze se připojit k Redis v 10.XX.XX.28:6379:Neznámá chyba – při přístupu z Spring Batch nebo Windows

  3. Mongoose:jaké jsou rozdíly mezi Model.create a Collection.insert

  4. Mongo Seřadit podle počtu zápasů v poli