Menu Docs
Página inicial do Docs
/ / /
Driver C++
/

Configurar o TLS (Transport Layer Security)

Nesta página

  • Visão geral
  • Habilitar TLS
  • Especifique um arquivo CA
  • Especifique um diretório de CA
  • Verifique a revogação do certificado
  • OCSP
  • Lista de revogação de certificados
  • Apresentar um Certificado de Cliente
  • Forneça uma senha de chave
  • Permitir TLS Inseguro
  • Documentação da API

Neste guia, você aprenderá a usar o TLS protocolo para proteger sua conexão com um sistema do MongoDB .

Ao habilitar o TLS para uma conexão, o driver C++ executa as seguintes ações:

  • Usa TLS para se conectar ao MongoDB deployment

  • Verifica o certificado do sistema

  • Garante que o certificado certifique o sistema

Para saber como configurar seu sistema MongoDB para TLS, consulte o guia de configuração TLS no manual do MongoDB Server .

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.

Dica

O driver C++ delega a maior parte do comportamento TLS ao driver MongoDB C. Para obter informações sobre como o driver C lida com o TLS, incluindo etapas de configuração e comportamento esperado, consulte Configurar o TLS na documentação do driver C.

Para habilitar o TLS para a conexão com sua instância do MongoDB , defina a opção de conexão tls como true em sua string de conexão, conforme mostrado no exemplo a seguir:

mongocxx::uri uri("mongodb://<hostname>:<port>/?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 .

Durante a negociação TLS, o sistema do MongoDB apresenta um arquivo de chave de certificado para seu aplicativo para estabelecer sua identidade. Normalmente, o certificado de um sistema é assinado por uma CA conhecida, e seu aplicativo depende dessa CA para validar o certificado.

No entanto, durante os testes, você pode querer agir como sua própria CA. Nesse caso, você deve instruir o driver C++ a usar seus certificados CA em vez dos assinados por outro CA.

Para fazer isso, especifique o caminho para um arquivo .pem contendo a cadeia de certificado raiz. Você pode fazer isso de duas maneiras: definindo uma propriedade em um objeto mongocxx::options::tls ou usando o parâmetro tlsCAFile em sua string de conexão.

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.pem_file("/path/to/file.pem");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCAFile=/path/to/file.pem");

Se você estiver usando OpenSSL ou LibreSSL (libtls) para suporte a TLS, também poderá instruir o driver C++ a procurar um arquivo CA em um diretório. O driver pesquisa nesse diretório se não encontrar um arquivo CA no caminho especificado na opção tlsCAFile ou pem_file .

O seguinte exemplo de código mostra como utilizar a opção ca_dir para especificar o diretório que o driver deve pesquisar:

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_dir("/path/to/search/");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);

Dica

Esta opção corresponde ao OpenSSL SSL_CTX_load_verify_locations e o LibreSSL tls_config_set_ca_path Parâmetro.

Quando um certificado X.509 não é mais confiável - por exemplo, se sua chave privada tiver sido comprometida - a CA revoga o certificado. O driver C++ inclui duas maneiras de verificar se o certificado de um servidor foi revogado.

O processo do Protocolo de Status do Certificado Online (OCSP) varia dependendo da versão do MongoDB Server à qual você está se conectando:

  • MongoDB v4.4 ou posterior: o servidor grampeia uma resposta OCSP com registro de data e hora em seu certificado. O driver C++ valida o certificado em relação à resposta OCSP. Se a CA tiver revogado o certificado ou se a resposta OCSP for inválida, a negociação TLS falhará.

  • MongoDB v4.3 ou anterior: o servidor fornece um ponto de extremidade OCSP, com o qual o driver C++ entra em contato diretamente. O driver C++ então valida o certificado em relação à resposta OCSP. Se a CA não tiver revogado o certificado, o handshake TLS continuará, mesmo que a resposta OCSP seja inválida ou malformada.

Para impedir que o driver C++ entre em contato com o ponto de extremidade OCSP, defina a opção de conexão tlsDisableOCSPEndpointCheck como true em sua string de conexão, conforme mostrado no exemplo de código a seguir:

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsDisableOCSPEndpointCheck=true");

Em vez de usar o OCSP, você pode instruir o driver C++ a verificar o certificado do servidor em relação a uma Lista de revogação de certificados (CRL) publicada pela CA.

O exemplo de código a seguir mostra como usar a opção crl_file para especificar o caminho para especificar o caminho para um arquivo .pem da CA:

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.crl_file("/path/to/file.pem");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);

Dica

Você pode especificar um arquivo CRL no formato .pem ou .der .

Algumas implementações do MongoDB exigem que cada aplicação de conexão apresente um certificado de cliente que comprove sua identidade. Para especificar o certificado do cliente para o driver C++ apresentar, especifique o caminho do arquivo .pem que contém seu certificado e chave privada.

Você pode fazer isso de duas maneiras: definindo uma propriedade em um objeto mongocxx::options::tls ou usando o parâmetro tlsCertificateKeyFile em sua string de conexão.

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.pem_file("/path/to/file.pem");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem");

Importante

Seu certificado de cliente e chave privada devem estar no mesmo arquivo .pem . Se estiverem armazenados em arquivos diferentes, você deverá concatená-los. O exemplo a seguir mostra como concatenar um arquivo de chave e um arquivo de certificado em um terceiro arquivo chamado combined.pem em um sistema Unix:

$ cat key.pem cert.pem > combined.pem

Se a chave privada em seu arquivo de certificado estiver criptografada, você deverá fornecer a senha. Você pode fazer isso de duas maneiras: definindo uma propriedade em um objeto mongocxx::options::tls ou usando o parâmetro tlsCertificateKeyFilePassword em sua string de conexão.

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.pem_file("/path/to/file.pem");
tls_options.pem_password("<password>");
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/file.pem&tlsCertificateKeyFilePassword=<password>");

Quando o TLS está habilitado, o driver C++ verifica automaticamente o certificado apresentado pelo servidor . Ao testar seu código, você pode desativar essa verificação. Isso é conhecido como TLS inseguro.

Quando o TLS inseguro está ativado, o driver exige apenas que o servidor apresente um certificado X.509 . O driver aceita um certificado mesmo que alguma das seguintes afirmações seja verdadeira:

  • O nome do host do servidor e o nome do assunto (ou nome alternativo do assunto) no certificado não correspondem.

  • O certificado expirou ou ainda não é válido.

  • O certificado não tem um certificado raiz confiável na cadeia.

  • A finalidade do certificado não é válida para identificação do servidor.

Observação

Mesmo quando o TLS inseguro está habilitado, a comunicação entre o cliente e o servidor é criptografada com TLS.

Para habilitar o TLS inseguro, defina a opção de conexão tlsInsecure como true em sua string de conexão, conforme mostrado no exemplo de código a seguir:

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true");

Para desabilitar somente a validação do certificado, defina a opção tlsAllowInvalidCertificates como true e defina a opção tlsInsecure como false (ou omita):

mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.allow_invalid_certificates(true);
client_options.tls_opts(tls_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true");
mongocxx::client client(uri, client_options);
mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidCertificates=true");

Para desabilitar somente a verificação do nome de host, configure a opção tlsAllowInvalidHostnames para true e configure a opção tlsInsecure para false (ou omita):

mongocxx::uri uri("mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidHostnames=true");

Aviso

Não use em produção

Sempre defina as opções tlsInsecure, tlsAllowInvalidCertificates e tlsAllowInvalidHostnames como false em produção.

Definir qualquer uma dessas opções como true em um ambiente de produção torna seu aplicativo desprotegido e potencialmente vulnerável a certificados expirados e a processos externos que se apresentam como instâncias de cliente válidas.

Para saber mais sobre como configurar o TLS para o driver C++ , consulte a seguinte documentação da API:

Voltar

Especificar opções de conexão