Mensagem de erro
SSL routines:tls_process_client_certificate:peer did not return a certificate
Também aparece como
- error:0A0000C7:SSL routines::peer did not return a certificate
O OpenSSL 3.x registra “error:0A0000C7:SSL routines:tls_process_client_certificate:peer did not return a certificate:<source>”. O nginx não passa por esse caminho: com ssl_verify_client on, ele conclui o handshake e, em vez disso, retorna HTTP 400 “No required SSL certificate was sent”.
OpenSSL (server side, mutual TLS) — SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE
O que significa
Este é o registro, no lado do servidor, de um handshake de TLS mútuo que falhou: o servidor exigiu um certificado de cliente (SSL_VERIFY_FAIL_IF_NO_PEER_CERT) e o cliente não enviou nenhum. O servidor então aborta com um alerta (certificate_required no TLS 1.3, handshake_failure no TLS 1.2), que o cliente vê como um erro de alerta.
Por que acontece
O cliente não tem certificado configurado
comumUma nova implantação, um segredo rotacionado que não chegou ao cliente ou uma biblioteca que não recebeu o certificado e a chave.
Verificações de integridade do balanceador de carga e monitoramento
comumOs verificadores de integridade geralmente se conectam sem certificado de cliente; em um servidor que exige certificado em toda conexão, eles geram um fluxo constante dessas linhas.
O cliente não encontrou nenhum certificado compatível com a lista de CAs do servidor
ocasionalNavegadores e algumas bibliotecas só oferecem um certificado emitido por uma das CAs que o servidor anuncia; caso contrário, enviam uma mensagem de certificado vazia.
Como corrigir
- 1.
Configurar o certificado de cliente
Forneça ao cliente o certificado e a chave dele e teste com curl --cert/--key.
bash # Test from the client side with a certificate curl --cert client.pem --key client.key https://mtls.example.com/ - 2.
Tornar o certificado opcional onde for preciso
Servidores que também atendem verificações de integridade ou caminhos públicos podem solicitar certificados de forma opcional e exigi-los por caminho.
text # nginx: request but do not require a certificate on paths that must stay open (health checks) ssl_verify_client optional; location /internal/ { if ($ssl_client_verify != SUCCESS) { return 403; } } - 3.
Verificar os nomes de CA anunciados
O emissor dos certificados de cliente precisa estar na lista que o servidor envia; caso contrário, clientes que selecionam certificados automaticamente não vão oferecer nenhum.
bash # The CA list the server advertises must include the issuer of the client certificates openssl s_client -connect mtls.example.com:443 -servername mtls.example.com </dev/null 2>/dev/null \ | sed -n '/Acceptable client certificate CA names/,/^Requested/p'