Mensagem de erro
SSL routines:ssl3_read_bytes:tlsv13 alert certificate required
Também aparece como
- error:0A00045C:SSL routines::tlsv13 alert certificate required
- SSL alert number 116
O OpenSSL imprime “error:0A00045C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required:…:SSL alert number 116”; o curl imprime “curl: (56) OpenSSL SSL_read: OpenSSL/<version>: error:0A00045C:SSL routines::tlsv13 alert certificate required, errno 0”. No TLS 1.2, a mesma situação costuma terminar, em vez disso, com handshake_failure (alerta 40).
OpenSSL (client side) — TLS 1.3 alert 116 (certificate_required) from a mutual-TLS server
O que significa
O servidor exige TLS mútuo e o cliente concluiu um handshake TLS 1.3 sem apresentar certificado, por isso o servidor respondeu com o alerta 116 (certificate_required). No TLS 1.3, o certificado de cliente é verificado depois que o cliente já considera o handshake concluído; é por isso que ferramentas como o curl informam o erro durante a primeira leitura (código de saída 56 do curl), e não durante a conexão.
Por que acontece
Nenhum certificado de cliente configurado
comumO cliente não recebeu um certificado e uma chave (curl sem --cert, uma biblioteca sem a opção de certificado de cliente, uma máquina nova sem o certificado instalado).
O cliente tinha um certificado, mas não de uma CA aceita
ocasionalClientes que escolhem um certificado automaticamente (navegadores, algumas bibliotecas) só enviam um emitido por uma CA da lista “acceptable CA names” do servidor; se nenhum corresponder, não enviam nada.
Um proxy faz a terminação do TLS antes do servidor mTLS
ocasionalUm balanceador de carga ou proxy entre o cliente e o servidor faz a terminação da primeira conexão TLS e abre a sua própria, sem certificado de cliente, até o backend que exige um.
Como corrigir
- 1.
Apresentar o certificado de cliente
Passe o certificado e a chave privada ao cliente (curl --cert/--key, s_client -cert/-key, a opção de certificado de cliente da biblioteca HTTP).
bash openssl s_client -connect mtls.example.com:443 -servername mtls.example.com \ -cert client.pem -key client.key -brief </dev/null curl --cert client.pem --key client.key https://mtls.example.com/ - 2.
Ler as CAs que o servidor aceita
O openssl s_client mostra a lista “Acceptable client certificate CA names” que o servidor envia; a cadeia do seu certificado precisa levar a uma dessas CAs.
bash # Which CAs does the server accept client certificates from? 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' - 3.
Verificar o próprio certificado
Ele precisa estar dentro do período de validade, ter sido emitido por uma CA aceita, e o extendedKeyUsage dele (se presente) precisa incluir clientAuth.
bash # The client certificate must be valid, issued by an accepted CA, and allow clientAuth openssl x509 -in client.pem -noout -subject -issuer -dates -ext extendedKeyUsage
Erros relacionados
SSL routines:tls_process_client_certificate:peer did not return a certificateOpenSSL (server side, mutual TLS)SSL routines:ssl3_read_bytes:ssl/tls alert handshake failureOpenSSL (client side)SSL_do_handshake() failed (SSL: error:0A000418:SSL routines::tlsv1 alert unknow…nginx error log / OpenSSL400 No required SSL certificate was sentnginx