MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB SSL със самоподписани сертификати в C#

Когато разгръщате MongoDB в производството, силно се препоръчва да използвате SSL-разрешена гео-разпределена конфигурация на набор от реплики за максимална сигурност и наличност. ScaleGrid ви предоставя две опции за настройка на SSL.

Една от опциите е да закупите свои собствени подписани от CA SSL сертификати и да ги конфигурирате на сървъра на MongoDB. Ако приложението ви се свързва с производствената база данни през публична мрежа, свържете се с [email protected], за да научите повече за това.

Но по подразбиране ние конфигурираме самоподписани сертификати за SSL, когато създаваме възли за нов клъстер. Това избягва допълнителни разходи и може да бъде еднакво сигурен, когато е правилно конфигуриран. Но това означава, че вашият драйвер на MongoDB се нуждае от помощ, за да потвърди веригата от сертификати.

Когато обработват самоподписани сертификати, някои разработчици заобикалят валидирането изцяло и сериозно компрометират сигурността! В тази публикация в блога ви показваме два метода за сигурно свързване към сървър на MongoDB, конфигуриран със самоподписани сертификати за SSL, с помощта на официалния C# драйвер MongoDB. С няколко прости стъпки можете да предоставите на драйвера си необходимата информация, за да потвърди сертификата на сървъра и да запази връзката сигурна.

Как да свържете MongoDB SSL към вашето C# приложение Щракнете за Tweet

Предварителни условия

Преди да продължите,

  • Уверете се, че приложението ви може да се свърже с вашето внедряване на ScaleGrid. Моля, вижте нашия помощен документ за MongoDB Connections, за да прегледате общите стъпки за свързване на вашето приложение към внедряване на ScaleGrid.
  • Трябва да имате инсталиран драйвер MongoDB. Моля, вижте документите на MongoDB Driver, за да прегледате стъпките за инсталиране и използване на C# MongoDB.Driver.

Забележка:Всички примерни кодове са тествани с помощта на MongoDB Driver v2.8.1 заедно с .NET Framework v4.6.1. Въпреки това, те трябва да работят на всяка сравнително нова версия на .NET Framework и MongoDB драйвер.

Не забравяйте да...

Променете пътеките на файловете и URL адресите за връзка в примерните кодове към вашите собствени файлови пътеки и URL адреси. В противен случай примерните кодове няма да работят. Моля, вижте получерните части на примерните кодове за това къде трябва да направите промени. Например:

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

Метод 1:Добавяне на сертификата ScaleGrid към Windows Trust Store

Един от най-простите начини за използване на самоподписани сертификати с C# и .NET Framework е добавянето на сертификата като „Доверен корен“ в Windows Trust Store. Ето как можете да го направите:

  1. Изтеглете вашия CA сертификат от потребителския интерфейс на ScaleGrid.
  2. Отворете подкана на PowerShell – ако искате да добавите сертификата като доверен корен за всички потребители, ще трябва да го отворите в административен режим.
  3. Изпълнете следната команда или направете това с помощта на конзолата за управление на Microsoft.:
    • За да добавите само за текущия потребител:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • За да добавите за всички:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Това е! Сега самоподписаният сертификат ще премине всички проверки по подразбиране и вие сте готови да създадете клиент на MongoDB.

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

Метод 2:Използване на обратно извикване за персонализирано валидиране

Има два проблема с добавянето на ScaleGrid сертификат към Windows Trust Store:

  • Настройките важат за всички програми, работещи на машината:това може да е уязвимост в сигурността.
  • Това трябва да се направи веднъж за всяка машина. Ако преместите кода си на нов сървър, той може внезапно да спре да работи. Това прави метода предразположен към човешка грешка.

Следователно, препоръчителният начин за свързване с помощта на самоподписани сертификати е да използвате обратно извикване по избор за валидиране, което проверява сертификата. Ето как можете да направите това:

  1. Изтеглете вашия CA сертификат и го запазете на място, до което приложението ви има достъп (това обикновено ще бъде неговата директория с данни).
  2. От вашето приложение можете да прочетете този сертификат и да съответствате на този, който получавате от сървъра MongoDB.
  3. Алтернативно можете да съхранявате криптографски хеш на сертификата. Вместо да четете сертификата и да съпоставяте, можете да изчислите криптографския хеш върху получения сертификат и да съпоставите резултатите.

Ето примерна програма, която има CA сертификат, съхранен в директорията bin с името caCert.cer. Той просто отпечатва списък с всички бази данни, които съществуват на сървъра 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;
    }
  }
}

Отстраняване на неизправности

Ако имате проблеми с свързването с внедряването на MongoDB с активиран SSL, ето няколко съвета за отстраняване на грешки:

  • Първо, проверете дали наистина можете да се свържете със сървъра на MongoDB от сървъра, на който се изпълнява вашето приложение. Най-простият начин да направите това е да инсталирате mongo shell на клиентската машина. В Linux няма да е необходимо да инсталирате целия сървър на MongoDB – можете да изберете да инсталирате само обвивката. След като обвивката е налична, опитайте да използвате „Синтаксис на командния ред“, който предоставяме, за да опитате да се свържете със сървъра.
  • Ако не можете да се свържете чрез mongo shell, това означава, че клиентската машина не може да достигне до порт 27017 на сървърите на MongoDB. Вижте настройките на вашата група за сигурност, VPC и/или защитна стена на ScaleGrid, за да се уверите, че има свързаност между клиентските и сървърните машини.
  • Ако мрежовата връзка е правилна, следващото нещо, което трябва да проверите, е дали използвате версии на MongoDB Driver и .NET Framework, които са съвместими с версията на вашия MongoDB сървър.
  • Ако сте потвърдили, че версиите на драйвера са правилни, опитайте да стартирате примерна програма на C# в режим за отстраняване на грешки, подобно на примера, който предоставихме по-горе. Изпълнението стъпка по стъпка ще помогне за отстраняването на причината за проблема.
  • Ако все още имате проблеми със свързването с вашия екземпляр, моля, свържете се с нас на [email protected] с подробни резултати от горните стъпки за отстраняване на неизправности и с точните версии на C# и драйвера Mongo, които използвате.

Ако сте нов в ScaleGrid и искате да опитате този урок, регистрирайте се за безплатна 30-дневна пробна версия, за да разгледате платформата и да изпробвате свързването на MongoDB с вашето C# приложение .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да получите достъп до MongoDB Instance 4.2?

  2. пролетни данни mongodb id картографиране на полета

  3. Актуализирайте колекцията MongoDB с помощта на $toLower

  4. mongodb получава _id като низ в заявката за намиране

  5. Как да получите целия брой на модела мангуста?