Menu Docs
Página inicial do Docs
/ / /
Driver de fluxos reativos do Java
/ /

TLS/SSL

Nesta página

  • API MongoClient
  • Especificar TLS/SSL em ConnectionString
  • Especificar TLS/SSL em MongoClientSettings
  • Especifique o Java SE SSLContext em MongoClientSettings
  • Personalizar configuração TLS/SSL através do Netty SslContext
  • Desativar verificação de nome de host
  • Tarefas comuns de configuração TLS/SSL
  • Configurar o armazenamento confiável e o armazenamento de chaves
  • Forçar TLS v1.2
  • OCSP

Por padrão, o driver suporta conexões TLS/SSL para servidores MongoDB usando o suporte subjacente para TLS/SSL fornecido pelo JDK. Isso pode ser alterado utilizando a extensibilidade da API Java SE, ou usando a API Netty.

Você pode configurar o driver para usar TLS/SSL especificando opções em um ConnectionString ou em uma instância do MongoClientSettings .

Inclua as seguintes declarações de importação:

import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoClient;

Para especificar TLS/SSL em um ConnectionString, especifique ssl=true como parte da connection string:

MongoClient mongoClient = MongoClients.create("mongodb://localhost/?ssl=true");

Inclua as seguintes declarações de importação:

import com.mongodb.MongoClientSettings;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoClient;

Para especificar TLS/SSL em uma instância MongoClientSettings , defina a propriedade enabled como true:

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true))
.build();
MongoClient client = MongoClients.create(settings);

Inclua as seguintes declarações de importação:

import javax.net.ssl.SSLContext;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoClient;

Para especificar o javax.net.ssl.SSLContext com MongoClientSettings, configure a propriedade sslContext :

SSLContext sslContext = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true).context(sslContext))
.build();
MongoClient client = new MongoClient(settings);

Inclua as seguintes declarações de importação:

import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.SslProvider;

Observação

O driver testa com o Netty na versão io.netty:netty-all:4.1.87.Final

Para instruir o driver a usar io.netty.handler.ssl.SslContext, configure NettyTransportSettings ao definir seu MongoClientSettings.

Utilize MongoClientSettings.Builder.transportSettings() e NettyTransportSettings.Builder.sslContext() para construir suas configurações:

SslContext sslContext = SslContextBuilder.forClient()
.sslProvider(SslProvider.OPENSSL)
.build();
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> builder.enabled(true))
.transportSettings(TransportSettings.nettyBuilder()
.sslContext(sslContext)
.build())
.build();
MongoClient client = MongoClients.create(settings);

Para obter mais detalhes sobre io.netty.handler.ssl.SslProvider,consulte a documentação do Netty.

Por padrão, o driver garante que o nome de host incluído no certificado SSL do servidor corresponda ao nome de host fornecido ao construir um MongoClient.

Se seu aplicativo precisar desabilitar a verificação do nome do host, você deverá indicar explicitamente isso em MongoClientSettings:

MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.invalidHostNameAllowed(true);
})
.build();

Esta seção é baseada na documentação do Oracle JDK, portanto, algumas partes podem ser inaplicáveis ao seu JDK ou à implementação personalizada de TLS/SSL que você usa.

Você pode configurar armazenamentos confiáveis e armazenamentos de chaves específicos para o cliente usando javax.net.ssl.SSLContext.init(KeyManager[] km, TrustManager[] tm, SecureRandom random) ou pode definir os armazenamentos padrão da JVM.

Um aplicativo típico precisará definir várias propriedades do sistema JVM para garantir que o cliente possa validar o certificado TLS/SSL apresentado pelo servidor:

  • javax.net.ssl.trustStore: o caminho para um armazenamento de confiança que contém o certificado da autoridade de assinatura

  • javax.net.ssl.trustStorePassword: a senha para acessar este armazenamento de confiança

O armazenamento de confiança normalmente é criado com o programa de linha de comando keytool fornecido como parte do JDK:

keytool -importcert -trustcacerts -file <path to certificate authority file>
-keystore <path to trust store> -storepass <trust store password>

Um aplicativo típico também precisará definir várias propriedades do sistema JVM para garantir que o cliente apresente um certificado de cliente TLS/SSL para o servidor MongoDB:

  • javax.net.ssl.keyStore: o caminho para um armazenamento de chaves que contém os certificados TLS/SSL do cliente

  • javax.net.ssl.keyStorePassword: a senha para acessar este armazenamento de chaves

O armazenamento de chaves é normalmente criado com o programa de linha de comando keytool ou openssl . Por exemplo, se você tiver um arquivo com o certificado do cliente e sua chave privada e quiser criar um armazenamento de chaves no PKCS #12 formato, você pode executar o seguinte comando:

openssl pkcs12 -export -in <path to client certificate & private key file>
-out <path to key store> -passout pass:<trust store password>

Para saber mais sobre como configurar um aplicativo Java para TLS/SSL, consulte o Guia de Referência JSSE.

Alguns aplicativos podem querer forçar apenas o protocolo TLS 1.2 . Para fazer isso, configure a propriedade do sistema jdk.tls.client.protocols para TLSv1.2.

Os ambientes de tempo de execução Java antes do Java 8 começarem a habilitar o protocolo TLS 1.2 somente em atualizações posteriores, conforme mostrado na seção anterior. Para que o driver force o uso do protocolo TLS 1.2 com um ambiente de tempo de execução Java anterior ao Java 8, verifique se a atualização tem o TLS 1.2 ativado.

Observação

O driver não pode ativar o OCSP por padrão de forma individual MongoClient .

Um aplicativo precisará definir o seguinte sistema JVM e propriedades de segurança para garantir que o OCSP orientado ao cliente esteja ativado:

  • com.sun.net.ssl.checkRevocation: quando definido como true, esta propriedade do sistema habilita a verificação de revogação

  • ocsp.enable: Quando definido como true, essa propriedade de segurança habilita o OCSP orientado ao cliente

Para configurar um aplicativo para usar o OCSP orientado ao cliente, o aplicativo já deve estar configurado para se conectar a um servidor usando TLS. A definição dessas propriedades do sistema é necessária para habilitar o OCSP orientado ao cliente.

Observação

O suporte para TLS fornecido pelo JDK utiliza o comportamento de "falha rígida" no caso de um respondente OCSP indisponível, em contraste com mongosh e os drivers que utilizam comportamento de "falha suave".

Importante

A exceção a seguir pode ocorrer ao usar o grampeamento OCSP com ambientes de execução Java que usam o protocolo TLS 1.3 (o Java 11 e superiores usam TLS 1.3 por padrão):

javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request

A exceção se deve a um problema conhecido com o TLS 1.3 no Java 11 e superior. Para evitar essa exceção ao usar ambientes de tempo de execução Java que operam no protocolo TLS 1.3 , você pode forçar o aplicativo a usar o protocolo TLS 1.2 . Para fazer isso, defina a propriedade do sistema jdk.tls.client.protocols como TLSv1.2.

Um aplicativo precisará definir várias propriedades do sistema JVM para configurar o grampeamento OCSP:

  • jdk.tls.client.enableStatusRequestExtension: quando definido para true (seu valor padrão), habilita o grampeamento OCSP.

  • com.sun.net.ssl.checkRevocation: quando definido como true, habilita a verificação de revogação. Se essa propriedade não estiver definida como true, a conexão poderá prosseguir independentemente da presença ou do status das informações de revogação.

Para configurar um aplicativo para usar o grampeamento OCSP, o aplicativo já deve estar configurado para se conectar a um servidor usando TLS, e o servidor deve estar configurado para grampear uma resposta OCSP ao certificado que ele retorna como parte do handshake TLS.

Para saber mais sobre como configurar um aplicativo Java para usar OCSP, consulte OCSP orientado ao cliente e Grampeamento de OCSP na documentação Java.

Voltar

Conecte-se ao MongoDB