Visão geral
Neste guia, você pode aprender a usar o protocolo TLS (Transport Layer Security) para proteger sua conexão com uma implantação do MongoDB .
Para se conectar a um sistema do MongoDB usando TLS, você deve executar as seguintes etapas:
Ative uma conexão TLS no
Mongo::Client
.Especifique o certificado TLS do cliente.
Especifique o certificado da Autoridade de Certificação (CA) para verificar o certificado TLS do servidor.
Para saber como configurar seu sistema MongoDB para TLS, consulte o guia de configuração TLS no manual do MongoDB Server .
Observação
Esta página pressupõe conhecimento prévio de TLS/SSL e acesso a certificados válidos. Uma descrição completa de certificados TLS/SSL, PKI (Public Key Infrastructure) e CAs está além do escopo desta documentação. Para saber mais sobre o TLS, veja o Wikipedia sobre Transport Layer Security.
Habilitar TLS
Você pode habilitar o TLS para a conexão com sua deployment do MongoDB das seguintes maneiras:
Defina a opção
ssl
comotrue
em um novo objetoMongo:Client
.Defina a opção
tls
comotrue
em sua string de conexão.
Observação
convenção de nomenclatura SSL
Todas as versões do MongoDB Server suportadas pelo driver Ruby v2.6 e posteriores implementam somente TLS. 2.6 e não use SSL.
Por motivos históricos, o driver Ruby prefixa as opções TLS com ssl
em vez de tls
. A versão 3.0 e posterior do driver Ruby usarão o prefixo tls
para nomes de opções Ruby.
Para configurar certificados, você deve especificar as seguintes opções:
ssl_cert
: O arquivo de certificado usado para verificar a conexão com uma implementação do MongoDB .ssl_key
: O arquivo de chave privada usado para verificar a conexão com um sistema MongoDB .ssl_ca_cert
: O arquivo que contém os certificados CA concatenados usado para validar os certificados passados do sistema do MongoDB para o cliente. Se você não especificar um valor para esta opção, o driver utilizará o armazenamento de certificados raiz do sistema padrão como âncora de confiança.
No exemplo a seguir, o certificado TLS e a chave privada correspondente são fornecidos em arquivos separados:
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_cert: 'path/to/client.crt', ssl_key: 'path/to/client.key', ssl_ca_cert: 'path/to/ca.crt' )
Você pode especificar o certificado TLS e a chave privada em um único arquivo, mas as opções de certificado e chave privada ainda devem ser especificadas. No exemplo a seguir, o certificado TLS e a chave privada são definidos no mesmo arquivo client.pem
:
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_cert: 'path/to/client.pem', ssl_key: 'path/to/client.pem', ssl_ca_cert: 'path/to/ca.crt', )
Para configurar certificados, você deve especificar as seguintes opções de URI:
tlsCertificateKeyFile
: O arquivo que contém o certificado e o arquivo de chave usado para verificar a conexão com um sistema do MongoDB .tlsCAFile
: O arquivo que contém os certificados CA concatenados usado para validar os certificados passados do sistema do MongoDB para o cliente. Se você não especificar um valor para esta opção, o driver utilizará o armazenamento de certificados raiz do sistema padrão como âncora de confiança.
client = Mongo::Client.new( "mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=path%2fto%2fclient.pem&tlsCAFile=path%2fto%2fca.crt")
O arquivo contendo o certificado e a chave geralmente tem uma extensão ''.crt'' ou .pem
.
Os valores de opção de URI devem ser codificados por porcentagem. Isso se aplica, por exemplo, a barras (/) nos caminhos, que são codificados como %2f
.
Especificar certificados TLS do cliente
O driver Ruby oferece várias opções para você especificar o certificado TLS, a chave e o certificado CA com diferentes dados ou tipos de objeto .
Certificado TLS
Você pode fornecer uma das seguintes opções para especificar o certificado TLS:
Nome da opção | Tipo de dados/objeto aceito | Descrição |
---|---|---|
|
| O caminho do arquivo de certificado usado para verificar a conexão com uma implementação do MongoDB . |
|
| O objeto de certificado usado para verificar a conexão com um sistema do MongoDB . |
|
| Uma string contendo o certificado codificado em PEM usado para verificar a conexão com um sistema do MongoDB . |
Chave privada TLS
Você pode fornecer uma das seguintes opções para especificar a chave privada TLS:
Nome da opção | Tipo de dados/objeto aceito | Descrição |
---|---|---|
|
| O caminho do arquivo de chave privada usado para verificar a conexão com um sistema do MongoDB . |
|
| O objeto de chave privada usado para verificar a conexão com um MongoDB deployment. |
|
| Uma senha para a chave privada. |
|
| Uma string contendo a chave privada codificada PEM usada para verificar a conexão com um sistema do MongoDB . |
Certificado TLS CA
Você pode fornecer uma das seguintes opções para especificar o certificado TLS CA:
Nome da opção | Tipo de dados/objeto aceito | Descrição |
---|---|---|
|
| O caminho do arquivo contendo certificados de CA concatenados usados para validar os certificados passados do sistema do MongoDB para o cliente. |
|
| Uma array de objetos representando os certificados CA usados para validar os certificados passados do sistema do MongoDB para o cliente. |
|
| Uma string contendo um certificado de CA codificado por PEM usado para validar certificados passados do sistema do MongoDB para o cliente. |
Modificar o contexto TLS
Se sua configuração do TLS exigir personalização, você poderá definir ganchos de contexto do TLS adicionando um objeto Ruby nativo Proc
à array Mongo.tls_context_hooks
. Adicione o objeto Proc
à array antes de criar quaisquer instâncias do Mongo::Client
.
O seguinte exemplo de código habilita a cifra AES256-SHA como a única cifra a ser usada para TLS:
Mongo.tls_context_hooks.push( Proc.new { |context| context.ciphers = ["AES256-SHA"] } )
As opções de contexto TLS do driver Ruby são baseadas no tratamento nativo de SSL pelo Ruby. Para saber mais sobre as opções de contexto TLS disponíveis, consulte a documentação Ruby para SSLContext.
Verificação do OCSP
Se o certificado fornecido pelo servidor contiver um URI de ponto de extremidade OCSP, o driver emitirá uma solicitação de Protocolo de Status do Certificado Online (OCSP) para o ponto de extremidade especificado por padrão para verificar a validade do certificado.
Para desabilitar a verificação de ponto de extremidade do OCSP, defina a opção :ssl_verify_ocsp_endpoint
Ruby como false
ou defina a opção tlsDisableOCSPEndpointCheck
URI como true
ao criar um cliente.
Observação
JRuby não suporta verificação OCSP
Como o JRuby não expõe corretamente os URIs de endpoint OCSP, o driver não verifica os endpoints OCSP quando o aplicação subjacente é executado no JRuby.
Permitir TLS Inseguro
Quando o TLS está habilitado, o driver Ruby verifica automaticamente o certificado apresentado pelo servidor . Ao testar seu código, você pode desativar essa verificação. Isso é conhecido como TLS inseguro.
Quando o TLS inseguro está ativado, o driver exige apenas que o servidor apresente um certificado X.509 . O driver aceita um certificado mesmo que alguma das seguintes afirmações seja verdadeira:
O nome do host do servidor e o nome do assunto (ou nome alternativo do assunto) no certificado não correspondem.
O certificado expirou ou ainda não é válido.
O certificado não tem um certificado raiz confiável na cadeia.
A finalidade do certificado não é válida para identificação do servidor.
Observação
Mesmo quando o TLS inseguro está habilitado, a comunicação entre o cliente e o servidor é criptografada com TLS.
Para habilitar o TLS inseguro, defina a opção sslVerify
do cliente ou a opção tlsInsecure
URI como true
:
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_verify: false )
client = Mongo::Client.new('mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true')
Da mesma forma, você pode definir as seguintes opções para desabilitar a verificação do certificado ou do nome do host:
ssl_verify_certificate
: Desative a validação do certificado definindo a opção comofalse
.ssl_verify_hostname
: Desative a verificação do nome do host definindo a opçãofalse
.
tlsAllowInvalidCertificates
: Desative a validação do certificado definindo a opção comotrue
.tlsAllowInvalidHostnames
: Desative a validação do nome de host definindo a opção comotrue
.
Aviso
Não use TLS inseguro na produção
Sempre desative o TLS inseguro na produção.
Habilitar o TLS inseguro em um ambiente de produção torna seu aplicação inseguro e potencialmente vulnerável a certificados expirados e processos externos que se apresentam como instâncias de cliente válidas.
Documentação da API
Para obter mais informações sobre qualquer um dos tipos e métodos discutidos neste guia, consulte a seguinte documentação da API: