Pular para o conteúdo
ecdsa.com
nginxOutras ferramentas

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

Como corrigir

  1. 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. 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. 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; }
    }

Erros relacionados

Ver toda a base de erros de assinatura