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ệ VÀ 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