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 TweetPř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:
|
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:
- Stáhněte si certifikát CA z uživatelského rozhraní ScaleGrid.
- 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.
- 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:
- 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ář).
- 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.
- 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# .