ステップ1:MongoDB3.0を入手する
最初に知っておく必要があるのは、SSLはMongoDB3.0以降ですぐにサポートされるだけであるということです。 Ubuntuのデフォルトのリポジトリには3.0がないため、入手方法は次のとおりです。
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は現在のところ最新の安定バージョンですが、3.0.7をお気に入りのリリースに置き換えてください。
ステップ2:秘密鍵、証明書、およびPEMファイルを取得する
PEMには、公開鍵証明書とそれに関連する秘密鍵が含まれています。これらのファイルは、Certificate AuthroityからIRLドルで取得するか、次のようにOpenSSLで生成できます。
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はPEMファイルとして使用され、mongodb-cert.keyは秘密鍵ファイルであり、mongodb-cert.crtはCAファイルとしても使用できる証明書ファイルです。これらの3つすべてが必要になります。
ステップ3:MongoDを構成する
これらのファイルを、それらが属する/ etc /ssl/フォルダーにコピーしたと想定します。次に、MongoDB構成ファイルを開きます。
sudo vi /etc/mongod.conf
「#ネットワークインターフェース」セクションを次のように変更します:
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
ssl:
mode: allowSSL
PEMKeyFile: /etc/ssl/mongodb.pem
#CAFile: /etc/ssl/mongodb-cert.crt
ご注意ください :bindIp
をコメントアウトしています 。これにより、外部接続でMongoデータベースにアクセスできます。これが最終目標であると想定しています(ローカルホストでトラフィックを暗号化するのはなぜですか? )。ただし、これは、MongoDBサーバーの承認ルールを設定した後でのみ行う必要があります。
CAFileもオプションであるため、コメント化されています。この投稿の最後で、認証局の信頼を設定する方法について説明します。
いつものように、構成ファイルの変更を有効にする前に、MongoDBを再起動する必要があります:
sudo service mongod restart
サーバーの起動に失敗しましたか?あなたはあなた自身ですが、おそらくあなたの証明書ファイルに問題があります。 mongod
を実行すると、起動エラーを確認できます 手動:
sudo mongod --config /etc/mongod.conf
ステップ4:サーバー設定をテストする
ノード構成をいじる前に、mongo
に接続して、サーバーのセットアップが正しく機能していることを確認しましょう。 コマンドラインクライアント:
mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates
証明書のドメイン名が127.0.0.1
でない限り またはlocalhost
、--sslAllowInvalidHostnames
フラグが必要です。これがないと、おそらく次のエラーが発生します:
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
ステップ5:Node.JS/Mongooseを構成する
node-mongodb-native
を使用している場合 Nodeアプリケーションにパッケージ化したら、すぐに停止してMongooseの使用を開始します。それほど難しいことではありません。そうは言っても、mongoose.connect()
mongodb.connect()
と実質的に同じAPIを使用します 、適切に置き換えてください。
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);
ステップ6:[オプションで]認証局を介して証明書を確認します
SSL証明書を検証するには、CA(またはバンドル)を取得する必要があります )認証局からのファイル。これは証明書ファイルによく似ていますが、多くの場合、複数の証明書が含まれています(証明書が有効であることを確認するための信頼の鎖を形成します )。自己署名証明書を使用している場合は、mongodb-cert.crt
を使用できます。 CAファイルとして。
また、MongoDBサーバーのホスト名が証明書の作成に使用されたものと一致していることを確認する必要があります。
ステップ6.3:mongod
を更新します 構成
sudo vi /etc/mongod.conf
「#ネットワークインターフェース」セクションを次のように変更します:
# 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
ステップ6.4:サーバー設定をテストする
mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem
Mongoクライアントは、CAファイルを渡して、正しいサーバーと通信していることを確認することもできます。これは、--sslCAFile
を使用して行われます。 パラメータ
CAFileで構成されたMongoサーバーでは、クライアントが有効な証明書を所有している必要があります AND サーバーの秘密鍵。 mongoシェルクライアントでは、これは--sslPEMKeyFile
を渡すことによって行われます。 パラメータ。
PEMファイルなし(サーバーの証明書を含む )、次のエラーが表示される場合があります:
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
net.ssl.weakCertificateValidation
を有効にすることで、PEMファイルなしでクライアントからの要求を受け入れるようにサーバーを構成できます。 、しかし、あなたは本当の利益のためにあなたのセキュリティを弱めるでしょう。
ステップ6.5:Node.JS/Mongooseを構成する
ここにはいくつかの落とし穴があるので、我慢してください。
まず、node-mongodb-native
が必要です 2.0
またはそれ以降。マングースを使用している場合は、マングース4.0
が必要です。 またはそれ以降。以前のMongooseバージョンはnode-mongodb-native
を使用します 1.*
これは、いかなる立場においても証明書の検証をサポートしていません。
次に、sslAllowInvalidHostnames
はありません。 またはnode-mongodb-nativeで利用可能な同様のオプション。これはnode-mongodb-native
ではありません 開発者は修正できます(私は今までに持っていたでしょう )ノード0.10。*で使用可能なネイティブTLSライブラリには、このためのオプションがないためです。ノード4.*および5.*には、checkServerIdentity
があります。 希望を与えるオプションですが、io.jsのマージ後に元のノードブランチからブランチに切り替えると、現時点で少し頭痛の種になる可能性があります。
では、これを試してみましょう:
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')
}
}
;
ホスト名/IPの不一致エラーが発生した場合は、証明書を修正するか、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')
}
}
;
ソース