Menu Docs
Página inicial do Docs
/ / /
Java síncrono
/ /

Habilitar TLS/SSL em uma conexão

Nesta página

  • Visão geral
  • Habilitar TLS/SSL
  • Configurar certificados
  • Configurar o JVM Trust Store
  • Configurar o Armazenamento de Chaves JVM
  • Configurar um armazenamento confiável e um armazenamento de chaves específicos do cliente
  • Desativar verificação de nome de host
  • Restringir conexões ao TLS 1,2 Apenas
  • Personalizar configuração TLS/SSL através do Java SE SSLContext
  • Personalizar configuração TLS/SSL através do Netty SslContext
  • Protocolo de status do certificado online (OCSP)
  • OCSP orientado ao cliente
  • Grampeamento de OCLC

Neste guia, você pode aprender a se conectar a instâncias MongoDB com o protocolo de segurança TLS/SSL usando o suporte TLS/SSL subjacente no JDK. Para configurar sua conexão para usar TLS/SSL, habilite as configurações TLS/SSL em ConnectionString ou MongoClientSettings.

Observação

Depuração de TLS/SSL

Caso encontre problemas para configurar a conexão TLS/SSL, use a propriedade do sistema -Djavax.net.debug=all para exibir mais declarações de log. Consulte o guia da Oracle para a depuração de conexões TLS/SSL para obter mais informações.

Você pode habilitar o TLS/SSL para a conexão com sua instância do MongoDB de duas maneiras diferentes: por meio de um parâmetro em sua string de conexão ou usando um método na classe MongoClientSettings.Builder.

Observação

Se você se conectar usando o protocolo seedlist DNS, indicado pelo prefixo mongodb+srv em sua connection string, o driver ativará o TLS/SSL. Para desativá-lo, defina o valor do parâmetro tls ou ssl como false em sua connection string ou instância MongoClientSettings.

Para saber mais sobre o comportamento da conexão ao usar uma lista de sementes DNS, consulte a seção Formato de conexão SRV no manual do servidor.

Para habilitar TLS/SSL em uma conexão com uma ConnectionString, atribua ao parâmetro de string de conexão tls um valor de true na string de conexão passada para MongoClients.create():

MongoClient mongoClient = MongoClients.create("mongodb+srv://<db_username>:<db_password>@<cluster-url>?tls=true");

Para configurar as opções de conexão TLS/SSL do MongoClient usando a classe MongoClientSettings.Builder, chame o método applyToSslSettings(). Defina a propriedade enabled como true no bloco SslSettings.Builder para habilitar o TLS/SSL:

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

Os aplicativos Java que iniciam solicitações TLS/SSL exigem acesso a certificados criptográficos que comprovam a identidade do próprio aplicativo e de outros aplicativos com os quais o aplicativo interage. Você pode configurar o acesso a esses certificados em seu aplicativo com os seguintes mecanismos:

  • A Loja JVM Trust e a Loja JVM Key

  • Um repositório fiduciário e um repositório de chaves específicos para o cliente

Observação

As seções a seguir são baseadas 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.

Observação

Por padrão, o JRE inclui muitos certificados públicos comumente usados de autoridades de assinatura, como o Let's Encrypt. Como resultado, você pode se conectar a instâncias do MongoDB Atlas (ou a qualquer outro servidor cujo certificado seja assinado por uma autoridade no repositório de certificados padrão do JRE) com TLS/SSL sem configurar o repositório de confiança.

O armazenamento confiável da JVM salva certificados que identificam com segurança outros aplicativos com os quais seu aplicativo Java interage. Usando esses certificados, seu aplicativo pode provar que a conexão com outro aplicativo é genuína e segura contra adulteração por terceiros.

Se sua instância do MongoDB usa um certificado assinado por uma autoridade que não está presente no armazenamento de certificados padrão do JRE, seu aplicativo deve configurar duas propriedades do sistema para iniciar solicitações SSL/TLS. Essas propriedades garantem que seu aplicativo possa validar o certificado TLS/SSL apresentado por uma instância MongoDB conectada.

  • 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 o armazenamento de confiança definido em javax.net.ssl.trustStore

Você pode criar um armazenamento de confiança com a ferramenta de linha de comando keytool fornecida como parte do JDK:

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

Observação

Por padrão, as instâncias do MongoDB não executam validação de certificado de cliente. Você deve configurar o armazenamento de chaves se configurou sua instância do MongoDB para validar certificados de cliente.

O armazenamento de chaves JVM salva certificados que identificam com segurança seu aplicativo Java em outros aplicativos. Usando esses certificados, outros aplicativos podem provar que a conexão com o seu aplicativo é genuína e segura contra adulteração por terceiros.

Um aplicativo que inicia solicitações TLS/SSL precisa definir duas propriedades do sistema JVM para garantir que o cliente apresente um certificado TLS/SSL para a implantação 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 o armazenamento de chaves definido em javax.net.ssl.keyStore

Você pode criar um armazenamento de chaves com a ferramenta de linha de comando keytool ou OpenSSL.

Para obter mais informações sobre como configurar um aplicativo Java para usar TLS/SSL, consulte o Guia de referência JSSE.

Você pode configurar um armazenamento confiável e um armazenamento de chaves específicos do cliente usando o método init() da classe SSLContext.

Você pode encontrar um exemplo mostrando como configurar um cliente com uma instância do SSLContext na seção Personalizar Configuração TLS/SSL com um SSLContext deste guia.

Para mais informações sobre a classe SSLContext, consulte a documentação API para Contexto SSL.

Por padrão, o driver garante que o nome de host incluído nos certificados TLS/SSL do servidor corresponda aos nomes de host fornecidos ao construir um MongoClient. Para desabilitar a verificação do nome de host para seu aplicativo, você pode desabilitá-la explicitamente definindo a propriedade invalidHostNameAllowed do construtor true no lambda do construtor applytoSslSettings():

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

Aviso

Desabilitar a verificação de nome de host pode tornar sua configuração insegura. Desabilite a verificação de nome de host somente para fins de teste ou quando não houver outra alternativa.

Para restringir seu aplicativo para usar apenas o protocolo TLS 1,2, defina a propriedade do sistema jdk.tls.client.protocols como "TLSv1,2".

Observação

Java Runtime Environments (JREs) antes do Java 8 somente habilitam o protocolo TLS 1.2 em versões de atualização. Se o seu JRE não tiver habilitado o protocolo TLS 1.2, atualize para uma versão posterior para se conectar usando o TLS 1.2.

Se sua configuração de TLS/SSL exigir personalização, você poderá definir a propriedade sslContext de seu MongoClient passando um objeto SSLContext para o construtor no lambda applyToSslSettings():

SSLContext sslContext = ...
MongoClientSettings settings = MongoClientSettings.builder()
.applyToSslSettings(builder -> {
builder.enabled(true);
builder.context(sslContext);
})
.build();
MongoClient client = MongoClients.create(settings);

Se você usar o driver com Netty para E/S de rede, você tem uma opção para conectar uma implementação alternativa de protocolo TLS/SSL fornecida pela Netty .

import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.connection.netty.NettyStreamFactoryFactory;
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.79.Final

Para instruir o driver a usar o método io.netty.handler.ssl.SslContext, use o método NettyStreamFactoryFactory.Builder.sslContext. Consulte a documentação do método para obter detalhes sobre as diferentes variantes do io.netty.handler.ssl.SslProvider que o driver suporta e as implicações de usá-las.

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

OCSP é um padrão usado para verificar se os certificados X.509 foram revogados. Uma autoridade de certificação pode adicionar um certificado X.509 à Lista de revogação de certificados (CRL) antes do tempo de expiração para invalidar o certificado. Quando um cliente envia um certificado X.509 durante o handshake TLS, o servidor de revogação da CA verifica a CRL e retorna um status de "bom", "revocado" ou "desconhecido".

O condutor suporta as seguintes variações de OCSP:

  • OCSP orientado ao cliente

  • Grampeamento de OCLC

As seções a seguir descrevem as diferenças entre elas e como habilitá-las para seu aplicativo.

Observação

O driver Java utiliza os argumentos JVM configurados para o aplicativo e não pode ser substituído por uma instância MongoClient específica.

No OCSP controlado pelo cliente, o cliente envia o certificado em uma solicitação OCSP para um respondente OCSP depois de receber o certificado do servidor. O respondente do OCSP verifica o status do certificado com uma autoridade de certificação (CA) e relata se ele é válido em uma resposta enviada ao cliente.

Para habilitar o OCSP orientado ao cliente para seu aplicativo, defina as seguintes propriedades do sistema JVM:

Propriedade
Valor
com.sun.net.ssl.checkRevocation
Configure esta propriedade para true para habilitar a verificação de revogação.
ocsp.enable
Configure esta propriedade para true para habilitar OCSP orientado ao cliente.

Aviso

Se o respondente OCSP não estiver disponível, o suporte a TLS fornecido pelo JDK relatará uma "falha rígida". Isso difere do comportamento de "falha suave" do MongoDB Shell e de alguns outros drivers.

O grampeamento OCSP é um mecanismo no qual o servidor deve obter o certificado assinado da autoridade de certificação (CA) e incluí-lo em uma resposta OCSP com carimbo de data/hora para o cliente.

Para habilitar o grampeamento OCSP para seu aplicativo, defina as seguintes propriedades do sistema JVM:

Propriedade
Descrição
com.sun.net.ssl.checkRevocation
Configure esta propriedade para true para habilitar a verificação de revogação.
jdk.tls.client.enableStatusRequestExtension
Set this property to true to enable OCSP stapling.

If unset or set to false, the connection can proceed regardless of the presence or status of the certificate revocation response.

Para mais informações sobre OCSP, consulte os seguintes recursos:

Voltar

Compactação de rede