2015-01-23 5 views
0

어떻게 내가
내가 연결을 만들기 위해이 코드를 사용하고 있지만, 난 또 다른 코드를 시도MongoDB를하고 nodejs SSL/보안 연결

var Db = require('mongodb').Db; 
var Server = require('mongodb').Server; 
Db.connect('mongodb://xxx.xxx.xxx.xxx:27017/db-login', { auto_reconnect: true, poolSize:4, ssl:true }, function (err, db) { 

를 작동하지 않는 경우, SSL을 통해 MongoDB를하고 nodejs를 연결할 수 있습니다

var localIP='xxx.xxx.xxx.xxx:27017', ssl=true; 

어떤 도움이나 제안

답변

2

mongoDB 환경에서 SSL을 구성하려면 아래의 링크를 사용하십시오.

MongoDB 환경에서 SSL을 활성화해야하며 SSL을 응용 프로그램에서 활성화해야합니다. 다음으로

http://docs.mongodb.org/manual/tutorial/configure-ssl/http://docs.mongodb.org/manual/tutorial/configure-ssl-clients/

당신은 노드에서 SSL 연결을 구성 할 수 있습니다

var options = { 
    key: fs.readFileSync('ssl/your_ssl_key.key'), 
    cert: fs.readFileSync('ssl/your_ssl_cert.cert') 
}; 

https.createServer(options, app).listen(443); 

을 모든 사용자에 대한 HTTPS 연결을 강제하려면 리디렉션 강제 할 수

require("http").createServer(function (req, res) { 
    res.writeHead(301, { 
     'Content-Type': 'text/plain', 
     'Location': 'https://' + req.headers.host + req.url 
    }); 
    res.end('Redirecting to SSL\n'); 
}).listen(80); 

https.createServer(options, app).listen(443); 
+0

나는 MongoDB ssl 연결 만 필요하며 ssl 연결은 파이썬 코드를 사용하여 작동하지만 nodejs에서 연결을 만들려고 할 때 여기서 작동하지 않습니다 –

+0

@AtulJain Mongo 환경이 SSL 사용을 위해 올바르게 구성 되었습니까? 옵션 매개 변수 {ssl : true}로 수행중인 작업이 정확하기 때문입니다. 하지만 이것은 SSL을 MongoDB에서 올바르게 설정 한 경우에만 작동합니다. – Billy

+0

예, "https : // xxx.xxx.xxx.xxx:28017" "", 그리고 심지어 ssl을 사용하여 액세스하고 있기 때문에 " true –

2

1 단계 : MongoDB 3.0 얻기

먼저 알아 두어야 할 점은 SSL은 MongoDB 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 대체 주시기 : 우분투는 그래서 여기에 당신이 그것을 얻을 방법, 기본 저장소에서 3.0을 가지고 있지 않습니다.

2 단계 : 개인 키, 인증서 및 PEM은 PEM은 공개 키 인증서 및 관련 개인 키를 포함

을 파일을 가져옵니다. 이러한 파일 중 하나를 인증서 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 단계 : 구성 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 

서버가 시작되지나요? 스스로 해결할 수 있지만 인증서 파일에 문제가있을 수 있습니다.

sudo mongod --config /etc/mongod.conf 

4 단계 : 수동으로 mongod를 실행하여 시동 오류를 확인할 수 있습니다 서버 설정을 테스트

우리는 노드 구성 덤비는 갈 전에, 서버 설정이 연결하여 제대로 작동하는지 확인하자 몽고 명령 행 클라이언트 :

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates 

인증서에 도메인 이름이 127.0.0.1 또는 로컬 호스트가없는 한, --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를/몽구스

즉시 중지하고 시작, 노드 응용 프로그램에서 노드 MongoDB의 네이티브 패키지를 사용하는 경우 몽구스 사용. 그리 어렵지 않습니다. 즉, mongoose.connect()는 mongodb.connect()와 거의 동일한 API를 사용하므로 적절하게 대체하십시오.

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') 
      } 
     } 
     ; 

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 서버는 클라이언트가 유효한 인증서와 서버의 개인 키를 소유하고 있어야합니다. mongo 셸 클라이언트에서는 --sslPEMKeyFile 매개 변수를 전달하여이 작업을 수행합니다.(서버의 인증서 포함)를 PEM 파일없이

,이 오류가 나타날 수 있습니다 : 서버가 net.ssl.weakCertificateValidation를 활성화하여 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 

, 그러나 당신은 진짜 이득을 위해 당신의 안전을 약해질 것입니다.

단계 6.5) 구성 Node.js를/몽구스

여기 개는 몇 날 너무 노출이 있습니다

.

먼저 node-mongodb-native 2.0 이상이 필요합니다. 몽구스를 사용하고 있다면, 몽구스 4.0 이상이 필요합니다. 이전의 몽구스 버전은 임의의 용량으로 인증서 유효성 검사를 지원하지 않는 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') 
     } 
    } 
    ; 

당신이 당신의 인증서를 수정 또는 sslValidate 비활성화하여이 모든 노력을 부정하거나, 호스트 이름/IP 불일치 오류를 받고하는 경우 :

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') 
     } 
    } 
    ; 

출처 : http://www.bainweb.com/2015/11/connecting-to-mongodb-over-tlsssl-with.html

+3

자신의 블로그에 연결하는 것만으로는 좋은 대답이 아닙니다. 링크를 사용하여 문제를 해결하고 콘텐츠의 본질을 제공하는 방법을 설명하면 더 나은 답을 얻을 수 있습니다. 커뮤니티 친화적 인 방법?] (// meta.stackexchange.com/questions/94022/) – Mogsdad

+0

공유 해 주셔서 감사합니다. – sivi