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.
API MongoClient
Você pode configurar o driver para usar TLS/SSL especificando opções em um ConnectionString
ou em uma instância do MongoClientSettings
.
Especificar TLS/SSL em ConnectionString
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");
Especificar TLS/SSL em MongoClientSettings
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);
Especifique o Java SE SSLContext em MongoClientSettings
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);
Personalizar configuração TLS/SSL através do Netty SslContext
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.
Desativar verificação de nome de host
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();
Tarefas comuns de configuração TLS/SSL
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.
Configurar o armazenamento confiável e o armazenamento de chaves
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.
Definir o armazenamento confiável padrão
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 assinaturajavax.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>
Definir o armazenamento de chaves padrão
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 clientejavax.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.
Forçar TLS v1.2
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.
OCSP
Observação
O driver não pode ativar o OCSP por padrão de forma individual MongoClient
.
OCSP orientado ao cliente
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 comotrue
, esta propriedade do sistema habilita a verificação de revogaçãoocsp.enable
: Quando definido comotrue
, 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".
Grampeamento de OCLC
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 paratrue
(seu valor padrão), habilita o grampeamento OCSP.com.sun.net.ssl.checkRevocation
: quando definido comotrue
, habilita a verificação de revogação. Se essa propriedade não estiver definida comotrue
, 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.