O ScaleGrid é compatível com a configuração SSL para MongoDB e pode ser facilmente configurado conforme descrito em uma postagem anterior. Também discute a necessidade e os prós e contras do MongoDB com TLS/SSL.
Atualmente, o ScaleGrid usa certificados autoassinados para SSL ao criar nós para um novo cluster. Como os aplicativos Node.js sobre o driver MongoDB Node.js ou Mongoose são escolhas muito populares em nossa plataforma, criamos esta postagem para compartilhar um plano de solução passo a passo para os problemas mais comuns ao usar o SSL do MongoDB com autoassinado certificados em Node.js. Esta discussão pertence ao MongoDB Node.js versão 2.0 e Mongoose versão 4.0.3.
No ScaleGrid, também oferecemos a opção de comprar seus próprios certificados SSL e configurá-los no servidor MongoDB. Envie um e-mail para [email protected] para saber mais sobre esta oportunidade.
Adicionando arquivo de certificado de CA
Para melhorar a segurança de sua conexão SSL, você pode especificar a CA a ser usada para validar o certificado SSL do servidor MongoDB. O Node.js tem uma lista padrão de CAs “raiz” conhecidas que ele consulta se uma CA não for especificada durante o tempo de criação da conexão. No entanto, como estamos falando de certificados autoassinados, teremos que especificar um arquivo de certificado CA para verificação. Você pode copiar o arquivo de certificado CA que foi usado para auto-assinatura na máquina cliente (para ScaleGrid, isso está descrito em nossa postagem SSL mais antiga) e, em seguida, usar o
sslCA
opção para apontar para o caminho deste arquivo, permitindo assim a verificação do servidor também. Mangusto
-
Para clusters autônomos:
var fs = require('fs'); var mongoose = require('mongoose'); var certFileBuf = fs.readFileSync(<path to CA cert file>); var mongoUrl = 'mongodb://admin:[email protected]:27017/admin?ssl=true'; var options = { server: { sslCA: certFileBuf } }; mongoose.connect(mongoUrl, options); ...
-
Para clusters de conjunto de réplicas:
var fs = require('fs'); var mongoose = require('mongoose'); var certFileBuf = fs.readFileSync(<path to CA cert file>); var mongoUrl = 'mongodb://admin:[email protected]:27017,test1.servers.example.com.com:27017/admin?replicaSet=RS-rstestNode-0&ssl=true'; var options = { replset: { sslCA: certFileBuf } } mongoose.connect(mongoUrl, options); ...
MongoDB Native Driver (e wrappers em torno dele, como Mongoskin)
-
Para clusters autônomos:
var certFileBuf = fs.readFileSync(<path to CA cert file>); var mongoUrl = 'mongodb://admin:[email protected]:27017/admin?ssl=true'; var options = { server: { sslCA: certFileBuf} }; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); MongoClient.connect(mongoUrl, options, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); db.close(); });
-
Para clusters de conjunto de réplicas:
O parâmetro de opção para conjuntos de réplicas é replSet :
var options = { replSet: { sslCA: certFileBuf } }; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); MongoClient.connect(mongoUrl, options, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); db.close(); });
Desativando a verificação do certificado SSL
Você também pode desabilitar a verificação do certificado SSL completamente. Isso talvez seja mais fácil de fazer e certamente funcionará para você, no entanto, não é o caminho recomendado. O driver MongoDB fornece opções de SSL no nível do servidor e no nível do conjunto de réplicas (
sslValidate
, sslCA
, sslCert
, sslKey
, sslPass
) para configurar conexões SSL. Todas as opções são descritas em detalhes na documentação. No caso de certificados autoassinados, a opção mais útil é o
sslValidate
. Isso pode ser definido como false
em caso de erros como: DEPTH_ZERO_SELF_SIGNED_CERT
(certificado autoassinado). Isso desativa a verificação do certificado SSL, mas a conexão ainda permanece criptografada. O Mongoose permite que você passe parâmetros para o driver em sua chamada de conexão. Por exemplo:
-
Clusters de conjunto de réplicas:
sslValidate
precisa ser definido comofalse
na opção ReplicaSet para:
var mongoose = require('mongoose'); var mongoUrl = 'mongodb://admin:[email protected]:27017,test1.servers.example.com.com:27017/admin?replicaSet=RS-rstestNode-0&ssl=true'; var options = { replset: {sslValidate: false} } mongoose.connect(mongoUrl, options); ...
-
Para driver nativo do MongoDB:
var options = { replSet: { sslValidate: false } }; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); MongoClient.connect(mongoUrl, options, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); db.close(); });
Desativando a verificação de nome de host
Em vez de desabilitar completamente a validação SSL, se os nomes de host são um problema, pode-se simplesmente desabilitar a verificação do nome de host.
A verificação do nome do host, como parte da verificação do certificado CA, é atualmente configurável. É sempre recomendável que essa verificação esteja ativada. No entanto, isso pode levar a falhas de verificação, mesmo que haja a menor incompatibilidade no nome do host, como no certificado CA versus o cliente que tenta se conectar. Assim, a maioria dos servidores TLS/SSL fornece uma maneira de desativá-lo. Por exemplo. o driver Java MongoDB 3.0 permite uma maneira de desabilitar a verificação do nome do host através do
sslInvalidHostNameAllowed
propriedade. Para MongoDB Native Driver 2.0 e superior, um parâmetro de opção booleana checkServerIdentity (padrão true ) é fornecido para desabilitar a verificação do nome do host. Está disponível nos níveis de servidor individual e conjunto de réplicas.