MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB SSL với chứng chỉ tự ký trong C #

Khi triển khai MongoDB trong phiên bản sản xuất, bạn nên sử dụng cấu hình bộ bản sao được phân phối theo địa lý có hỗ trợ SSL để bảo mật và khả dụng tối đa. ScaleGrid cung cấp cho bạn hai tùy chọn để thiết lập SSL.

Một tùy chọn là mua chứng chỉ SSL do CA ký của riêng bạn và định cấu hình chúng trên máy chủ MongoDB. Nếu ứng dụng của bạn kết nối với cơ sở dữ liệu sản xuất qua mạng công cộng, hãy liên hệ với [email protected] để tìm hiểu thêm về điều này.

Nhưng theo mặc định, chúng tôi định cấu hình chứng chỉ tự ký cho SSL khi tạo các nút cho một cụm mới. Điều này tránh thêm chi phí và có thể an toàn như nhau khi được định cấu hình chính xác. Nhưng điều này có nghĩa là trình điều khiển MongoDB của bạn cần một số trợ giúp để xác thực chuỗi chứng chỉ.

Khi xử lý các chứng chỉ tự ký, một số nhà phát triển đã né tránh việc xác thực tất cả cùng nhau và xâm phạm nghiêm trọng đến bảo mật! Trong bài đăng trên blog này, chúng tôi chỉ cho bạn hai phương pháp để kết nối an toàn với máy chủ MongoDB được định cấu hình với chứng chỉ tự ký cho SSL, sử dụng trình điều khiển C # MongoDB chính thức. Với một vài bước đơn giản, bạn có thể cung cấp cho trình điều khiển của mình thông tin cần thiết để xác thực chứng chỉ máy chủ và giữ an toàn cho kết nối.

Cách kết nối MongoDB SSL với ứng dụng C # của bạn Bấm để đăng bài

Điều kiện tiên quyết

Trước khi bạn tiếp tục,

  • Đảm bảo rằng ứng dụng của bạn có thể kết nối với việc triển khai ScaleGrid của bạn. Vui lòng tham khảo tài liệu trợ giúp MongoDB Connections của chúng tôi để xem lại các bước chung để kết nối ứng dụng của bạn với triển khai ScaleGrid.
  • Bạn cần cài đặt Trình điều khiển MongoDB. Vui lòng tham khảo tài liệu về Trình điều khiển MongoDB để xem lại các bước cài đặt và sử dụng C # MongoDB.Driver.

Lưu ý:Tất cả các mẫu mã đã được kiểm tra bằng cách sử dụng MongoDB Driver v2.8.1 cùng với .NET Framework v4.6.1. Tuy nhiên, chúng phải hoạt động trên bất kỳ phiên bản .NET Framework và MongoDB Driver nào gần đây nhất.

Hãy nhớ…

Sửa đổi đường dẫn tệp và URL kết nối trong các mẫu mã thành đường dẫn tệp và URL của riêng bạn. Nếu không, các mẫu mã sẽ không hoạt động. Vui lòng xem phần in đậm của các mẫu mã để biết nơi bạn cần thực hiện thay đổi. Ví dụ:

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

Phương pháp 1:Thêm chứng chỉ ScaleGrid vào Windows Trust Store

Một trong những cách đơn giản nhất để sử dụng chứng chỉ tự ký với C # và .NET Framework là thêm chứng chỉ dưới dạng “Trusted Root” trên Windows Trust Store. Đây là cách bạn có thể làm điều đó:

  1. Tải xuống Chứng chỉ CA của bạn từ giao diện người dùng ScaleGrid.
  2. Mở PowerShell Prompt - nếu bạn muốn thêm chứng chỉ làm chứng chỉ gốc tin cậy cho tất cả người dùng, bạn sẽ phải mở chứng chỉ đó ở chế độ quản trị.
  3. Thực thi lệnh sau hoặc thực hiện việc này bằng Microsoft Management Console.:
    • Để chỉ thêm cho người dùng hiện tại:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
    • Để thêm cho mọi người:
    Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'

Thế là xong! Bây giờ chứng chỉ tự ký sẽ vượt qua tất cả các xác thực mặc định và bạn đã sẵn sàng tạo ứng dụng khách MongoDB.

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

Phương pháp 2:Sử dụng Gọi lại Xác thực Tùy chỉnh

Có hai vấn đề khi thêm Chứng chỉ ScaleGrid vào Windows Trust Store:

  • Các cài đặt áp dụng cho tất cả các chương trình đang chạy trên máy:đây có thể là một lỗ hổng bảo mật.
  • Việc này phải được thực hiện một lần cho mỗi máy. Nếu bạn di chuyển mã của mình sang một máy chủ mới, nó có thể đột ngột ngừng hoạt động. Điều này khiến cho phương pháp này dễ bị lỗi do con người gây ra.

Do đó, cách được khuyến nghị để kết nối bằng chứng chỉ tự ký là sử dụng lệnh gọi lại xác thực tùy chỉnh để xác minh chứng chỉ. Đây là cách bạn có thể làm điều này:

  1. Tải xuống Chứng chỉ CA của bạn và lưu nó vào vị trí mà ứng dụng của bạn có thể truy cập (đây thường sẽ là thư mục dữ liệu của nó).
  2. Từ ứng dụng của mình, bạn có thể đọc chứng chỉ này và khớp với chứng chỉ bạn nhận được từ Máy chủ MongoDB.
  3. Ngoài ra, bạn có thể lưu trữ một hàm băm mật mã của chứng chỉ. Thay vì đọc chứng chỉ và đối sánh, bạn có thể tính toán băm mật mã trên chứng chỉ đã nhận và đối sánh kết quả.

Đây là chương trình mẫu có Chứng chỉ CA được lưu trữ trong thư mục bin với tên caCert.cer. Nó chỉ đơn giản là in ra danh sách tất cả các cơ sở dữ liệu tồn tại trên Máy chủ 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;
    }
  }
}

Khắc phục sự cố

Nếu bạn gặp sự cố khi kết nối với triển khai MongoDB có hỗ trợ SSL của mình, đây là một số mẹo để gỡ lỗi:

  • Trước tiên, hãy xác minh rằng bạn thực sự có thể kết nối với máy chủ MongoDB từ máy chủ nơi ứng dụng của bạn đang chạy. Cách đơn giản nhất để thực hiện việc này là cài đặt mongo shell trên máy khách. Trên Linux, bạn không cần phải cài đặt toàn bộ máy chủ MongoDB - bạn có thể chọn chỉ cài đặt shell. Sau khi shell khả dụng, hãy thử sử dụng 'Cú pháp dòng lệnh' mà chúng tôi cung cấp để cố gắng kết nối với máy chủ.
  • Nếu bạn không thể kết nối qua mongo shell, điều đó có nghĩa là máy khách không thể truy cập cổng 27017 của máy chủ MongoDB. Xem xét cài đặt tường lửa Nhóm bảo mật, VPC và / hoặc ScaleGrid của bạn để đảm bảo rằng có kết nối giữa máy khách và máy chủ.
  • Nếu kết nối mạng chính xác, điều tiếp theo cần kiểm tra là bạn đang sử dụng phiên bản MongoDB Driver và .NET Framework tương thích với phiên bản máy chủ MongoDB của bạn.
  • Nếu bạn đã xác nhận rằng các phiên bản trình điều khiển là chính xác, hãy thử chạy chương trình C # mẫu ở chế độ gỡ lỗi, tương tự như ví dụ chúng tôi đã cung cấp ở trên. Việc thực hiện từng bước sẽ giúp giải quyết tận gốc nguyên nhân của vấn đề.
  • Nếu bạn vẫn gặp sự cố khi kết nối với phiên bản của mình, vui lòng liên hệ với chúng tôi theo địa chỉ [email protected] để biết kết quả chi tiết của các bước khắc phục sự cố ở trên và với phiên bản chính xác của C # và Trình điều khiển Mongo mà bạn đang sử dụng.

Nếu bạn chưa quen với ScaleGrid và muốn dùng thử hướng dẫn này, hãy đăng ký bản dùng thử miễn phí 30 ngày để khám phá nền tảng và thử nghiệm kết nối MongoDB với ứng dụng C # của bạn .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cài đặt MongoDB trên CentOS 7

  2. Toán tử truy vấn MongoDB $ nin

  3. Mối quan hệ MongoDB:nhúng hay tham chiếu?

  4. MongoDB $ toLower

  5. DeprecationWarning:Nghe các sự kiện trên lớp Db đã không còn được dùng nữa và sẽ bị loại bỏ trong phiên bản chính tiếp theo