Menu Docs

Página inicial do DocsDesenvolver aplicaçõesMongoDB DriversDriver de sincronização Java

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 como se conectar às instâncias MongoDB com o TLS/SSL protocolo de segurança usando o suporte TLS/SSL subjacente no JDK. Para configurar sua conexão para usar TLS/SSL, habilite as configurações de TLS/SSL no ConnectionString ou MongoClientSettings.

Observação

Depuração de TLS/SSL

Se tiver problemas para configurar a conexão TLS/SSL, poderá usar a -Djavax.net.debug=all propriedade do sistema para exibir mais declarações de registro.Consulte o guia Oracle para depuração de conexõesTLS/SSL para 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 de DNS, consulte a seção Formato de conexão SRV no manual do servidor.

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 podem não se aplicar ao seu JDK ou à sua implementação personalizada de TLS/SSL.

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 confiável com a ferramenta keytool ferramenta de linha de comando 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 keytool ou openssl ferramenta de linha de comando.

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 SSLContext classe , 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

Desativar a verificação de nome de host pode tornar sua configuração insegura. Desative a verificação de nome de host apenas 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 TLS/SSL exigir personalização, você poderá definir a sslContext propriedade de seu MongoClient passando um SSLContext objeto para o construtor no applyToSslSettings() lambda :

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 a Netty para E/S de rede, você tem a opção de 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 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 motorista a usar io.netty.handler.ssl.SslContext, configure NettyTransportSettings quando você define suas configurações MongoClientSettings. Use MongoClientSettings.Builder.transportSettings e NettyTransportSettings.Builder.sslContext para criar 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

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
Configure esta propriedade como true para ativar o grampeamento OCSP.

Se não for definido ou for definido como false, a conexão poderá prosseguir independentemente da presença ou do status da resposta de revogação do certificado.

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

← Compressão de rede