Menu Docs
Página inicial do Docs
/ / /
Driver Scala
/

Configurar o TLS (Transport Layer Security)

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.

Você pode habilitar o TLS para a conexão com sua deployment do MongoDB das seguintes maneiras:

  • Utilize o método enabled() da classe SslSettings.Builder ao criar uma instância do MongoClientSettings

  • 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 .

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

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 assinatura

  • javax.net.ssl.trustStorePassword: a senha para acessar o armazenamento de confiança definido pela propriedade javax.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>

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 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 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 .

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.

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 classe SslSettings.Builder ao criar uma instância do MongoClientSettings

  • 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.

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.

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);

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.

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.

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

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 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

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 saber mais sobre OCSP, consulte os seguintes recursos:

Para obter mais informações sobre qualquer um dos tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Limitar o tempo de execução