MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

SSL MongoDB dengan sertifikat yang ditandatangani sendiri di C#

Saat menerapkan MongoDB dalam produksi, sangat disarankan agar Anda menggunakan konfigurasi kumpulan replika terdistribusi-geo yang diaktifkan SSL untuk keamanan dan ketersediaan maksimum. ScaleGrid memberi Anda dua opsi untuk menyiapkan SSL.

Salah satu opsi adalah membeli sertifikat SSL Anda sendiri yang ditandatangani CA dan mengonfigurasinya di server MongoDB. Jika aplikasi Anda terhubung ke database produksi melalui jaringan publik, hubungi [email protected] untuk mempelajari lebih lanjut tentang ini.

Tetapi secara default, kami mengonfigurasi sertifikat yang ditandatangani sendiri untuk SSL saat membuat node untuk cluster baru. Ini menghindari biaya tambahan, dan bisa sama-sama aman bila dikonfigurasi dengan benar. Tetapi ini berarti bahwa driver MongoDB Anda memerlukan bantuan untuk memvalidasi rantai sertifikat.

Saat menangani sertifikat yang ditandatangani sendiri, beberapa pengembang menghindari validasi bersama-sama, dan secara serius membahayakan keamanan! Dalam posting blog ini, kami menunjukkan kepada Anda dua metode untuk terhubung dengan aman ke server MongoDB yang dikonfigurasi dengan sertifikat yang ditandatangani sendiri untuk SSL, menggunakan driver C# MongoDB resmi. Dengan beberapa langkah sederhana, Anda dapat memberikan informasi yang dibutuhkan driver untuk memvalidasi sertifikat server dan menjaga koneksi tetap aman.

Cara Menghubungkan SSL MongoDB ke Aplikasi C# AndaKlik Untuk Tweet

Prasyarat

Sebelum melanjutkan,

  • Pastikan aplikasi Anda dapat terhubung ke penerapan ScaleGrid Anda. Silakan merujuk ke dokumen bantuan MongoDB Connections kami untuk meninjau langkah-langkah umum untuk menghubungkan aplikasi Anda ke penerapan ScaleGrid.
  • Anda harus menginstal Driver MongoDB. Silakan merujuk ke dokumen Driver MongoDB untuk meninjau langkah-langkah untuk menginstal dan menggunakan C# MongoDB.Driver.

Catatan:Semua contoh kode telah diuji menggunakan Driver MongoDB v2.8.1 bersama dengan .NET Framework v4.6.1. Namun, mereka harus bekerja pada versi terbaru dari .NET Framework dan Driver MongoDB.

Ingatlah untuk…

Ubah jalur file dan URL koneksi dalam contoh kode ke jalur file dan URL Anda sendiri. Jika tidak, sampel kode tidak akan berfungsi. Harap lihat bagian yang dicetak tebal dari contoh kode di mana Anda perlu melakukan perubahan. Misalnya:

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

Metode 1:Menambahkan Sertifikat ScaleGrid ke Windows Trust Store

Salah satu cara paling sederhana untuk menggunakan sertifikat yang ditandatangani sendiri dengan C# dan .NET Framework adalah menambahkan sertifikat sebagai "Akar Tepercaya" di Windows Trust Store. Inilah cara Anda melakukannya:

  1. Unduh Sertifikat CA Anda dari UI ScaleGrid.
  2. Buka Prompt PowerShell – jika Anda ingin menambahkan sertifikat sebagai root tepercaya untuk semua pengguna, Anda harus membukanya dalam mode administratif.
  3. Jalankan perintah berikut, atau lakukan ini menggunakan Konsol Manajemen Microsoft.:
    • Untuk menambahkan hanya untuk pengguna saat ini:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Untuk menambahkan untuk semua orang:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Itu dia! Sekarang sertifikat yang ditandatangani sendiri akan melewati semua validasi default, dan Anda siap untuk membuat klien MongoDB.

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

Metode 2:Menggunakan Callback Validasi Kustom

Ada dua masalah dengan menambahkan Sertifikat ScaleGrid ke Windows Trust Store:

  • Setelan berlaku untuk semua program yang berjalan di mesin:ini bisa menjadi kerentanan keamanan.
  • Ini harus dilakukan sekali per mesin. Jika Anda memindahkan kode Anda ke server baru, itu bisa tiba-tiba berhenti bekerja. Ini membuat metode ini rentan terhadap kesalahan manusia.

Oleh karena itu, cara yang disarankan untuk terhubung menggunakan sertifikat yang ditandatangani sendiri adalah dengan menggunakan panggilan balik validasi khusus yang memverifikasi sertifikat. Inilah cara Anda melakukannya:

  1. Unduh Sertifikat CA Anda dan simpan ke lokasi yang dapat diakses aplikasi Anda (biasanya ini adalah direktori datanya).
  2. Dari aplikasi Anda, Anda dapat membaca sertifikat ini dan mencocokkan dengan yang Anda terima dari Server MongoDB.
  3. Atau, Anda dapat menyimpan hash kriptografis sertifikat. Alih-alih membaca sertifikat dan mencocokkan, Anda dapat menghitung hash kriptografis atas sertifikat yang diterima dan mencocokkan hasilnya.

Berikut adalah contoh program yang menyimpan Sertifikat CA di bawah direktori binnya dengan nama caCert.cer. Itu hanya mencetak daftar semua database yang ada di Server 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;
    }
  }
}

Pemecahan masalah

Jika Anda mengalami masalah saat menyambungkan ke penerapan MongoDB berkemampuan SSL, berikut beberapa kiat untuk debugging:

  • Pertama, verifikasi bahwa Anda benar-benar dapat terhubung ke server MongoDB dari server tempat aplikasi Anda berjalan. Cara termudah untuk melakukannya adalah menginstal mongo shell di mesin klien. Di Linux, Anda tidak perlu menginstal seluruh server MongoDB – Anda dapat memilih untuk menginstal shell saja. Setelah shell tersedia, coba gunakan 'Command Line Syntax' yang kami sediakan untuk mencoba terhubung ke server.
  • Jika Anda tidak dapat terhubung melalui mongo shell, berarti mesin klien tidak dapat mencapai port 27017 dari server MongoDB. Lihat setelan firewall Grup Keamanan, VPC, dan/atau ScaleGrid Anda untuk memastikan bahwa ada konektivitas antara mesin klien dan server.
  • Jika konektivitas jaringan benar, hal berikutnya yang harus diperiksa adalah apakah Anda menggunakan versi Driver MongoDB dan .NET Framework yang kompatibel dengan versi server MongoDB Anda.
  • Jika Anda telah memastikan bahwa versi driver sudah benar, coba jalankan contoh program C# dalam mode debug, mirip dengan contoh yang kami berikan di atas. Eksekusi langkah demi langkah akan membantu mengatasi masalah.
  • Jika Anda masih mengalami masalah saat menghubungkan ke instans Anda, hubungi kami di [email protected] dengan hasil mendetail dari langkah pemecahan masalah di atas dan dengan versi C# dan Driver Mongo yang tepat yang Anda gunakan.

Jika Anda baru mengenal ScaleGrid dan ingin mencoba tutorial ini, daftar untuk uji coba 30 hari gratis untuk menjelajahi platform dan menguji koneksi MongoDB ke aplikasi C# Anda .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. nama bidang ClassName sedang dimasukkan ke dalam mongodb oleh morphia

  2. Menghapus catatan duplikat menggunakan MapReduce

  3. Tidak dapat terhubung ke MongoDB Atlas (queryTxt ETIMEOUT)

  4. Arsitektur aplikasi berbasis luwak

  5. Mongoose find() RegExp untuk bidang tipe Angka