Visão geral
Neste guia, você aprenderá a usar o protocolo TLS para proteger sua conexão com o MongoDB deployment.
Quando você habilita o TLS para uma conexão, a biblioteca PHP 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
A biblioteca PHP 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.
Habilitar TLS
Para habilitar o TLS para a conexão com sua implantação do MongoDB , defina a opção de conexão tls como true. Você pode fazer isso de duas maneiras: usando o uriOptions parâmetro do MongoDB\Client construtor ou por meio de um parâmetro em sua string de conexão.
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true'; $client = MongoDB\Client($uri);
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 .
Especifique um arquivo CA
Durante a negociação TLS, o sistema do MongoDB apresenta um arquivo de chave de certificado para seu aplicação para estabelecer sua identidade. Normalmente, o certificado de um sistema foi assinado por uma CA (autoridade de certificação) conhecida, e seu aplicação 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 a biblioteca PHP a usar seus certificados CA em vez dos assinados por outro CA.
Para fazer isso, use a opção de conexão tlsCAFile para especificar o caminho para um arquivo .pem que contém a cadeia de certificados raiz. Você pode fazer isso de duas maneiras: usando o uriOptions parâmetro do MongoDB\Client construtor ou por meio de um parâmetro em sua string de conexão.
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true, 'tlsCAFile' => '/path/to/ca.pem', ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsCAFile=/path/to/ca.pem'; $client = MongoDB\Client($uri);
Especifique um diretório de CA
Se você estiver usando OpenSSL ou LibreSSL (libtls) para suporte a TLS, também poderá usar a opção ca_dir para instruir a biblioteca PHP 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 .
O seguinte exemplo de código mostra como utilizar o parâmetro driverOptions para especificar a opção ca_dir :
$uri = 'mongodb://<hostname>:<port>'; $uriOptions = ['tls' => true]; $driverOptions = ['ca_dir' => '/path/to/search/']; $client = new MongoDB\Client($uri, $uriOptions, $driverOptions);
Dica
Esta opção corresponde ao parâmetro OpenSSL SSL_CTX_load_verify_locations e ao parâmetro LibreSSL tls_config_set_ca_path.
Verifique a revogação do certificado
Quando um certificado X.509 não é mais confiável - por exemplo, se sua chave privada tiver sido comprometida - a CA revoga o certificado. A biblioteca PHP inclui duas maneiras de verificar se o certificado de um servidor foi revogado.
OCSP
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. A biblioteca PHP 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 endpoint OCSP, com o qual a biblioteca PHP entra em contato diretamente. A biblioteca PHP 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.
Observação
Depreciação do OCSP Let's Encrypt
Let's Encrypt has ended OCSP support for newer certificates. New certificates issued by Let's Encrypt might not include an OCSP responder URL. OCSP revocation checking occurs only when a certificate contains an OCSP URI, so a missing OCSP URL is expected and doesn't necessarily indicate a problem with your MongoDB deployment.
Para impedir que a biblioteca PHP entre em contato com o endpoint OCSP, defina a opção de conexão tlsDisableOCSPEndpointCheck como true. Você pode fazer isso de duas maneiras: passando um argumento para o construtor MongoDB\Client ou por meio de um parâmetro em sua string de conexão.
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true, 'tlsDisableOCSPEndpointCheck' => true, ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsDisableOCSPEndpointCheck=true'; $client = MongoDB\Client($uri);
Observação
Mesmo que a opção tlsDisableOCSPEndpointCheck esteja definida como true, a biblioteca PHP ainda verificará qualquer resposta OCSP grampeada no certificado de um servidor.
Lista de revogação de certificados
Em vez de usar o OCSP, você pode usar a instrução da biblioteca PHP para verificar o certificado do servidor em relação a uma Lista de revogação de certificados (CRL) publicada pela CA. Para fazer isso, defina a opção crl_file para o caminho do arquivo da CRL. Inclua esta opção no driverOptions parâmetro do MongoDB\Client construtor , como mostrado no seguinte exemplo de código:
$uri = 'mongodb://<hostname>:<port>'; $uriOptions = ['tls' => true]; $driverOptions = ['crl_file' => '/path/to/file.pem']; $client = new MongoDB\Client($uri, $uriOptions, $driverOptions);
Dica
Você pode especificar um arquivo CRL no formato .pem ou .der .
Apresentar um Certificado de Cliente
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 a biblioteca PHP apresentar, defina a opção tleCertificateKeyFile para o caminho do arquivo .pem que contém seu certificado e chave privada.
Você pode fazer isso de duas maneiras: usando o parâmetro uriOptions do construtor MongoDB\Client ou por meio de um parâmetro em sua string de conexão.
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true, 'tlsCertificateKeyFile' => '/path/to/client.pem', ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/client.pem'; $client = MongoDB\Client($uri);
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
Forneça uma senha de chave
Se a chave privada em seu arquivo de certificado estiver criptografada, você deverá usar a opção tlsCertificateKeyFilePassword para fornecer a senha. Você pode fazer isso de duas maneiras: usando o uriOptions parâmetro do MongoDB\Client construtor ou por meio de um parâmetro em sua string de conexão.
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true, 'tlsCertificateKeyFile' => '/path/to/client.pem', 'tlsCertificateKeyFilePassword' => '<passphrase>', ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=/path/to/client.pem&tlsCertificateKeyFilePassword=<passphrase>'; $client = MongoDB\Client($uri);
Permitir TLS Inseguro
Quando o TLS está habilitado, a biblioteca PHP 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. Você pode fazer isso de duas maneiras: passando um argumento para o construtor MongoDB\Client ou por meio de um parâmetro em sua connection string.
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true, 'tlsInsecure' => true, ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true'; $client = MongoDB\Client($uri);
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-a:
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true, 'tlsAllowInvalidCertificates' => true, ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidCertificates=true'; $client = MongoDB\Client($uri);
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:
$uri = 'mongodb://<hostname>:<port>'; $options = [ 'tls' => true, 'tlsAllowInvalidHostnames' => true, ]; $client = new MongoDB\Client($uri, $options);
$uri = 'mongodb://<hostname>:<port>/?tls=true&tlsAllowInvalidHostnames=true'; $client = MongoDB\Client($uri);
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.
Documentação da API
Para saber mais sobre como configurar o TLS para a biblioteca PHP, consulte a seguinte documentação da API: