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

Kết nối với MongoDB qua SSL với Node.js

Bước 1:Lấy MongoDB 3.0

Điều đầu tiên bạn cần biết là SSL chỉ được hỗ trợ bên ngoài bởi MongoDB 3.0 trở lên. Ubuntu không có 3.0 trong kho lưu trữ mặc định, vì vậy đây là cách bạn lấy nó:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org=3.0.7 mongodb-org-server=3.0.7 mongodb-org-shell=3.0.7 mongodb-org-mongos=3.0.7 mongodb-org-tools=3.0.7

3.0.7 là phiên bản ổn định mới nhất tính đến thời điểm hiện tại, nhưng hãy thay thế 3.0.7 bằng bản phát hành yêu thích của bạn.

Bước 2:Lấy khóa cá nhân, chứng chỉ và tệp PEM

PEM chứa Chứng chỉ khóa công khai và Khóa cá nhân liên quan. Các tệp này có thể được lấy bằng đô la IRL từ Chứng chỉ xác thực hoặc được tạo bằng OpenSSL như vậy:

openssl req -newkey rsa:2048 -new -x509 -days 3650 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

mongodb.pem sẽ được sử dụng làm tệp PEM, mongodb-cert.key là tệp Khóa Riêng và mongodb-cert.crt là tệp Chứng chỉ cũng có thể được sử dụng làm tệp CA. BẠN SẼ CẦN TẤT CẢ BA ĐIỀU NÀY.

Bước 3:Định cấu hình MongoD

Chúng tôi sẽ giả định rằng bạn đã sao chép các tệp này vào thư mục / etc / ssl / của bạn nơi chúng thuộc về. Bây giờ chúng ta mở tệp cấu hình MongoDB của mình:

sudo vi /etc/mongod.conf

và sửa đổi phần "# giao diện mạng" như sau:

# network interfaces
net:
  port: 27017
  #bindIp: 127.0.0.1
  ssl:
    mode: allowSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    #CAFile: /etc/ssl/mongodb-cert.crt

XIN LƯU Ý :chúng tôi đang bình luận về bindIp . ĐIỀU NÀY CHO PHÉP CÁC KẾT NỐI BÊN NGOÀI truy cập vào cơ sở dữ liệu Mongo của bạn. Chúng tôi giả định rằng đây là mục tiêu cuối cùng của bạn ( Tại sao bạn lại mã hóa lưu lượng truy cập trên máy chủ cục bộ? ), nhưng bạn chỉ nên thực hiện việc này SAU KHI THIẾT LẬP QUY TẮC ỦY QUYỀN cho máy chủ MongoDB của bạn.

CAFile cũng được nhận xét vì nó là tùy chọn. Tôi sẽ giải thích cách thiết lập độ tin cậy của Tổ chức phát hành chứng chỉ ở cuối bài đăng này.

Như mọi khi, bạn phải khởi động lại MongoDB trước khi các thay đổi tệp cấu hình có hiệu lực:

sudo service mongod restart

MÁY CHỦ CỦA BẠN CÓ BẮT ĐẦU KHÔNG? Bạn đang ở một mình, nhưng có thể có sự cố với các tệp chứng chỉ của bạn. Bạn có thể kiểm tra lỗi khởi động bằng cách chạy mongod thủ công:

sudo mongod --config /etc/mongod.conf

Bước 4:Kiểm tra cài đặt máy chủ của bạn

Trước khi làm rối với các cấu hình Node, hãy đảm bảo rằng thiết lập máy chủ của bạn đang hoạt động bình thường bằng cách kết nối với mongo ứng dụng dòng lệnh:

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

Trừ khi tên miền trên chứng chỉ của bạn là 127.0.0.1 hoặc localhost , --sslAllowInvalidHostnames cờ là cần thiết. Nếu không có nó, bạn có thể sẽ gặp lỗi này:

E NETWORK  The server certificate does not match the host name 127.0.0.1
E QUERY    Error: socket exception [CONNECT_ERROR] for 
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

Bước 5:Định cấu hình Node.JS / Mongoose

Nếu bạn đang sử dụng node-mongodb-native gói trong ứng dụng Node của bạn, dừng ngay lập tức và bắt đầu sử dụng Mongoose. Nó không khó lắm đâu. Điều đó nói rằng, mongoose.connect() hầu như có cùng một API với mongodb.connect() , vì vậy hãy thay thế một cách thích hợp.

    var fs = require('fs')
      , mongoose = require('mongoose')
      , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
      , mongoOpt = {
          "sslValidate": false,
          "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
          "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt')
        }
      ;

mongoose.connect(mongoUri, mongoOpt);

Bước 6:[Tùy chọn] xác minh Chứng chỉ của bạn qua Tổ chức phát hành chứng chỉ

Để xác thực Chứng chỉ SSL của mình, bạn cần có CA ( hoặc gói ) từ Tổ chức phát hành chứng chỉ của bạn. Tệp này sẽ trông rất giống tệp Chứng chỉ của bạn, nhưng thường sẽ chứa nhiều Chứng chỉ ( tạo thành một chuỗi tin cậy để xác minh rằng chứng chỉ hợp lệ ). Nếu bạn đang sử dụng chứng chỉ tự ký, bạn có thể sử dụng mongodb-cert.crt của mình dưới dạng tệp CA.

Bạn cũng sẽ cần đảm bảo rằng tên máy chủ MongoDB của bạn khớp với tên được sử dụng để tạo chứng chỉ.

Bước 6.3:Cập nhật mongod của bạn cấu hình

sudo vi /etc/mongod.conf

và sửa đổi phần "# giao diện mạng" như sau:

# network interfaces net:   port: 27017   #bindIp: 127.0.0.1   ssl:
    mode: allowSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/mongodb-ca.crt

sudo service mongod restart

Bước 6.4:Kiểm tra cài đặt máy chủ của bạn

mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem

Mongo Clients cũng có thể chuyển vào tệp CA để xác minh rằng họ đang kết nối với đúng máy chủ. Điều này được thực hiện với --sslCAFile tham số

Máy chủ Mongo được định cấu hình bằng CAFile yêu cầu máy khách phải có Chứng chỉ hợp lệ Khóa riêng cho máy chủ. Trong ứng dụng khách shell mongo, điều này được thực hiện bằng cách chuyển vào --sslPEMKeyFile tham số.

Không có tệp PEM ( chứa Chứng chỉ của máy chủ ), bạn có thể gặp lỗi này:

I NETWORK  DBClientCursor::init call() failed
E QUERY    Error: DBClientBase::findN: transport error: 127.0.0.1:27017 ns: admin.$cmd query: { whatsmyuri: 1 }
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

Máy chủ có thể được định cấu hình để chấp nhận các yêu cầu từ máy khách mà không cần tệp PEM bằng cách bật net.ssl.weakCertificateValidation , nhưng bạn sẽ làm suy yếu tính bảo mật của mình mà không thu được lợi ích thực sự nào.

Bước 6.5:Định cấu hình Node.JS / Mongoose

Có một vài vấn đề ở đây, vì vậy hãy mang theo tôi.

Đầu tiên, bạn CẦN có node-mongodb-native 2.0 hoặc sau đó. Nếu bạn đang sử dụng Mongoose, thì bạn CẦN Mongoose 4.0 hoặc sau đó. Các phiên bản Mongoose trước đây sử dụng node-mongodb-native 1.* không hỗ trợ xác thực Chứng chỉ ở bất kỳ khả năng nào.

Thứ hai, không có sslAllowInvalidHostnames hoặc tùy chọn tương tự có sẵn trong node-mongodb-native. Đây không phải là thứ mà node-mongodb-native các nhà phát triển có thể sửa chữa ( Tôi sẽ có ngay bây giờ ) vì thư viện TLS gốc có sẵn trong Node 0.10. * không cung cấp tùy chọn cho việc này. Trong Node 4. * và 5. *, có checkServerIdentity tùy chọn mang lại hy vọng, nhưng việc chuyển từ nhánh Node ban đầu sang nhánh sau khi hợp nhất io.js có thể gây ra một chút đau đầu vào thời điểm hiện tại.

Vì vậy, hãy thử điều này:

var fs = require('fs')
  , mongoose = require('mongoose')
  , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
  , mongoOpt = {
      "server": { 
        "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
        "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
        "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
      }
    }
  ;

Nếu bạn gặp lỗi tên máy chủ / IP không khớp, hãy sửa chứng chỉ của bạn hoặc phủ nhận tất cả công việc khó khăn này bằng cách tắt sslValidate :

var fs = require('fs')
  , mongoose = require('mongoose')
  , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
  , mongoOpt = {
      "server": {
        "sslValidate": false,
        "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
        "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
        "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
      }
    }
  ;

Nguồn



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mối quan hệ chỉ mục / RAM MongoDB

  2. Lấy HTML từ MongoDB để sử dụng trong Mẫu

  3. làm thế nào để tôi có thể biết những cổng mongo đang lắng nghe từ trình bao mongo?

  4. MongoDB - Giới hạn kết quả của một truy vấn

  5. mongodb - Tìm tài liệu có giá trị số nguyên gần nhất