Pular para o conteúdo
ecdsa.com
OpenSSL (server side, mutual TLS)CLI do OpenSSL

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

Como corrigir

  1. 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. 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. 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'

Erros relacionados

Ver toda a base de erros de assinatura