Mensagem de erro
400 No required SSL certificate was sent
Também aparece como
- client sent no required SSL certificate while reading client request headers
O título da página é “400 No required SSL certificate was sent”; com um certificado que falha na verificação, o nginx mostra “400 The SSL certificate error” em vez disso. A linha de log é gravada no nível info, então fica invisível com o nível padrão de error_log.
nginx — ssl_verify_client on, request without a client certificate
O que significa
O nginx está configurado para TLS mútuo (ssl_verify_client on), e a requisição chegou por uma conexão TLS em que o cliente não apresentou nenhum certificado. Em vez de fazer o handshake falhar, o nginx o conclui e responde a toda requisição com esta página HTTP 400, registrando “client sent no required SSL certificate” no nível info. A correção é no cliente: ele precisa apresentar um certificado emitido pela CA de ssl_client_certificate.
Por que acontece
O cliente não enviou um certificado
comumO curl, scripts e clientes de API sem --cert/--key ou a opção equivalente da biblioteca; contêineres ou jobs de CI sem o secret do certificado.
O navegador não tinha um certificado correspondente
comumOs navegadores só oferecem certificados emitidos por uma CA que o nginx anuncia (tirada de ssl_client_certificate); com um certificado de outra CA, ou sem nenhum certificado importado, o navegador não envia nada.
Um proxy faz a terminação TLS antes do nginx
ocasionalUma CDN, um balanceador de carga ou outro nginx na frente abre a própria conexão TLS sem certificado de cliente; o TLS mútuo, então, precisa ser configurado nesse salto (ou feito na borda).
Como corrigir
- 1.
Apresentar o certificado de cliente
Passe o certificado e a chave para o cliente; para navegadores e para os repositórios de chaves do Windows/macOS, coloque-os em um pacote PKCS#12 e importe o arquivo.
bash curl --cert client.pem --key client.key https://mtls.example.com/ # Browsers: import the client certificate with its key as PKCS#12 openssl pkcs12 -export -in client.pem -inkey client.key -out client.p12 - 2.
Proxy para um serviço mTLS: configurar o certificado usado com o upstream
Quando o próprio nginx é o cliente do serviço mTLS, proxy_ssl_certificate e proxy_ssl_certificate_key fornecem o certificado na conexão com o upstream.
text # nginx proxying to an mTLS upstream: present the client certificate on the upstream connection location / { proxy_pass https://mtls.example.com; proxy_ssl_certificate /etc/nginx/tls/client.pem; proxy_ssl_certificate_key /etc/nginx/tls/client.key; proxy_ssl_server_name on; } - 3.
Exigir certificados só onde for preciso
Com ssl_verify_client optional e uma verificação de $ssl_client_verify em cada location, health checks e caminhos públicos continuam acessíveis sem certificado.
text # Require the certificate only where needed ssl_verify_client optional; location /api/ { if ($ssl_client_verify != SUCCESS) { return 403; } }