Configurar o TLS (Transport Layer Security)
Visão geral
Neste guia, você verá como usar o protocolo TLS para proteger sua conexão com um MongoDB deployment. O TLS é um protocolo criptográfico que protege a comunicação entre seu aplicativo e o MongoDB. Para configurar sua conexão para usar TLS, habilite a opção TLS e forneça seus certificados para validação ao criar um cliente.
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 Autoridades de Certificação (CAs) está além do escopo desta documentação. Para saber mais sobre o TLS, consulte o verbete da Wikipedia para Transport Layer Security.
Quando você habilita o TLS para uma conexão, o driver Scala executa as seguintes ações:
Usa TLS para se conectar ao MongoDB deployment
Verifica o certificado do sistema
Para saber como configurar seu sistema MongoDB para TLS, consulte o guia de configuração TLS no manual do MongoDB Server .
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 usando a API Netty ou a extensibilidade da API Java SE.
Dica
Prefira Netty para aplicativos assíncronos
Recomendamos o uso do Netty para aplicativos assíncronos porque ele oferece suporte à E/S assíncrona e lida com altos volumes de conexões de forma eficaz. Para saber mais sobre como usar o Netty para definir suas configurações de TLS, consulte a seção Configurar TLS/SSL usando o Netty SslContext deste guia.
Habilitar TLS
Você pode habilitar o TLS para a conexão com sua deployment do MongoDB das seguintes maneiras:
Utilize o método
enabled()
da classeSslSettings.Builder
ao criar uma instância doMongoClientSettings
Defina o parâmetro
tls
em seu URI de conexão
Selecione a aba MongoClientSettings ou Connection URI para ver o código correspondente que habilita o TLS:
val tlsUri = "mongodb://localhost:27017/" val tlsSettings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(tlsUri)) .applyToSslSettings(builder => builder.enabled(true)) .build() val tlsClient1 = MongoClient(tlsSettings)
val tlsClient2 = MongoClient("mongodb://localhost:27017/?tls=true")
Dica
Se a string de conexão incluir a modificação +srv
, que especifica o formato de conexão SRV, o TLS será habilitado na sua conexão por padrão.
Para saber mais sobre o formato de conexão SRV, consulte Formato de conexão SRV na documentação do MongoDB Server .
Configurar certificados
Observação
As instruções nestas seções são baseadas na documentação do Oracle JDK. Eles podem não se aplicar ao seu JDK ou à sua implementação personalizada de TLS/SSL.
Os aplicativos Scala que iniciam solicitações TLS exigem acesso a certificados criptográficos que comprovam a identidade do aplicativo e verificam outros aplicativos com os quais o aplicação Scala interage. Você pode configurar o acesso a esses certificados em seu aplicação das seguintes maneiras:
Use um armazenamento JVM confiável e um armazenamento JVM de chaves
Usar um armazenamento confiável e um armazenamento de chaves específicos do cliente
Configurar o JVM Trust Store
O armazenamento confiável da JVM salva certificados que identificam com segurança outros aplicativos com os quais seu aplicação Scala interage. Ao usar esses certificados, seu aplicação pode provar que a conexão com outro aplicação é genuína e segura contra adulteração por terceiros.
O Java Runtime Environment (JRE) fornece um armazenamento de certificados padrão, que inclui certificados públicos comumente usados de autoridades de assinatura. Se a implementação do MongoDB usar um certificado assinado por uma autoridade que não esteja presente no armazenamento de certificados padrão do JRE, seu aplicação deverá configurar as seguintes propriedades do sistema para iniciar solicitações TLS:
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 o armazenamento de confiança definido pela propriedadejavax.net.ssl.trustStore
Você pode usar a ferramenta de linha de comando keytool para definir as propriedades anteriores. O exemplo a seguir executa o comando keytool
para especificar o caminho do arquivo de autoridade de certificação, o caminho do armazenamento de confiança e a senha do armazenamento de confiança:
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <trust store password>
Configurar o Armazenamento de Chaves JVM
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.
Um aplicação que inicia solicitações TLS deve definir as seguintes propriedades do sistema JVM para garantir que o cliente apresente um certificado TLS 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 o armazenamento de chaves definido emjavax.net.ssl.keyStore
Você pode criar um armazenamento de chaves usando a ferramenta keytool ou openssl ferramenta de linha de comando.
Para saber mais sobre como configurar um aplicação Scala para usar o TLS, consulte o Guia de Referência JSSE na documentação da linguagem Java .
Configurar um armazenamento confiável e um armazenamento de chaves específicos do cliente
Você pode configurar um armazenamento confiável e um armazenamento de chaves específicos do cliente usando o método init()
da classe SSLContext
.
Para visualizar um exemplo que configura um cliente para usar uma SSLContext
instância, consulte a seção Personalizar Configuração com SSLContext deste guia.
Desativar verificação de nome de host
Por padrão, o driver garante que o nome de host incluído nos certificados TLS do servidor corresponda aos nomes de host fornecidos ao construir um MongoClient
. Você pode desabilitar a verificação de nome de host das seguintes maneiras:
Utilize o método
invalidHostNameAllowed()
da classeSslSettings.Builder
ao criar uma instância doMongoClientSettings
Defina o parâmetro
tlsAllowInvalidHostnames
em seu URI de conexão
Selecione a aba MongoClientSettings ou Connection URI para ver o código correspondente que desabilita a verificação do nome do host:
val invalidHostUri = "mongodb://localhost:27017/" val invalidHostSettings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(invalidHostUri)) .applyToSslSettings(builder => builder .enabled(true) .invalidHostNameAllowed(true) ) .build() val invalidHostClient1 = MongoClient(invalidHostSettings)
val invalidHostClient2 = MongoClient("mongodb://localhost:27017/?tls=true&tlsAllowInvalidHostnames=true")
Aviso
A desativação da verificação de nome de host torna seu aplicação desprotegido e potencialmente vulnerável a certificados expirados e processos externos que se apresentam como instâncias de cliente válidas.
Restringir conexões ao TLS 1.2
Para restringir seu aplicativo para usar somente o protocolo TLS 1.2 , configure a propriedade do sistema jdk.tls.client.protocols
para "TLSv1.2"
.
Observação
Os Java Runtime Environments (JREs) antes do Java 8 ativaram somente o protocolo TLS 1.2 em versões de atualização. Se o JRE não tiver habilitado o protocolo TLS 1.2, atualize para uma versão posterior para usar o TLS 1.2.
Configurar TLS/SSL usando Netty SslContext
Inclua as seguintes declarações de importação:
import io.netty.handler.ssl.SslContextBuilder import io.netty.handler.ssl.SslProvider import org.mongodb.scala.connection.TransportSettings
Observação
Versão do pacote Netty
O driver é testado com a versão do pacote Netty 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:
val sslContext = SslContextBuilder.forClient() .sslProvider(SslProvider.OPENSSL) .build() val nettySettings = MongoClientSettings.builder() .applyToSslSettings { builder => builder.enabled(true) } .transportSettings( TransportSettings.nettyBuilder() .sslContext(sslContext) .build() ) .build() val mongoClient = MongoClient(nettySettings);
Personalizar configuração com SSLContext
Se sua configuração do TLS exigir personalização, você poderá definir a propriedade sslContext
do seu objeto MongoClient
. Passe um objeto SSLContext
para o construtor de método context()
no bloco applyToSslSettings()
, conforme mostrado no código a seguir:
val sslContext = SSLContext.getDefault() val contextSettings = MongoClientSettings.builder() .applyToSslSettings(builder => builder .enabled(true) .context(sslContext) ) .build() val mongoClient = MongoClient(contextSettings);
Para mais informações sobre a classe SSLContext
, consulte a documentação API para Contexto SSL.
Protocolo de status do certificado online (OCSP)
OCSP é um padrão usado para verificar se os certificados X.509 foram revogados. Uma autoridade de certificação (CA) 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 good
, revoked
ou unknown
.
O condutor suporta as seguintes variações de OCSP:
OCSP orientado ao cliente
Grampeamento de OCLC
As seções a seguir descrevem essas variações e mostram como habilitá-las para seu aplicação.
Observação
O driver Scala utiliza os argumentos JVM configurados para o aplicação, que não podem ser substituídos por uma instância MongoClient
específica.
OCSP orientado ao cliente
No OCSP orientado ao cliente, o cliente recebe o certificado do servidor e envia esse certificado em uma solicitação OCSP para um respondente OCSP. O respondente do OCSP verifica o status do certificado com uma CA e envia um relatório sobre sua validade ao cliente.
Para habilitar o OCSP orientado ao cliente para seu aplicativo, defina as seguintes propriedades do sistema JVM:
Propriedade | Descrição |
---|---|
| Configure esta propriedade para |
| Configure esta propriedade para |
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.
Grampeamento de OCLC
O grampeamento OCSP é um mecanismo no qual o servidor deve obter o certificado assinado da CA e incluí-lo em uma resposta OCSP com registro de data e hora para o cliente.
Para habilitar o grampeamento OCSP para seu aplicativo, defina as seguintes propriedades do sistema JVM:
Propriedade | Descrição |
---|---|
| Configure esta propriedade para |
| 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 saber mais sobre OCSP, consulte os seguintes recursos:
OCSP orientado ao cliente e grampeamento OCSP na documentação do Oracle JDK 8
Documentação da API
Para obter mais informações sobre qualquer um dos tipos discutidos neste guia, consulte a seguinte documentação da API: