Mensagem de erro
verify error:num=26:unsuitable certificate purpose
Também aparece como
- Verify return code: 26 (unsuitable certificate purpose)
- error 26 at 0 depth lookup: unsuitable certificate purpose
O s_client imprime “verify error:num=26:…” e “Verify return code: 26 (…)”; o openssl verify imprime “error 26 at <depth> depth lookup: unsuitable certificate purpose”. O Go informa o mesmo problema como “x509: certificate specifies an incompatible key usage”.
OpenSSL CLI (openssl s_client / openssl verify -purpose) — X509_V_ERR_INVALID_PURPOSE
O que significa
Erro 26 do OpenSSL (X509_V_ERR_INVALID_PURPOSE): fora isso, a cadeia é válida, mas as extensões de um certificado não permitem a finalidade que está sendo verificada. O s_client verifica o certificado do servidor para a finalidade de servidor TLS, então um certificado cujo extendedKeyUsage lista só clientAuth (ou emailProtection) falha; o openssl verify verifica a finalidade que você passar em -purpose.
Por que acontece
O extendedKeyUsage não inclui serverAuth
comumCertificados de modelos de autenticação de cliente ou de S/MIME instalados em um servidor, ou um EKU escrito à mão sem serverAuth.
Um certificado de CA é usado como certificado de servidor
ocasionalServir um certificado com keyUsage limitado a keyCertSign/cRLSign não passa nas verificações de finalidade de servidor TLS.
O EKU de um intermediário exclui a finalidade
ocasionalO OpenSSL verifica as finalidades subindo pela cadeia; um intermediário restrito a outros usos torna os certificados folha abaixo dele inadequados para servidores TLS.
Como corrigir
- 1.
Ler as extensões de uso
As extensões extendedKeyUsage, keyUsage e basicConstraints indicam para que o certificado pode ser usado; o openssl verify -purpose verifica uma finalidade específica.
bash openssl x509 -in server.pem -noout -ext extendedKeyUsage,keyUsage,basicConstraints # Check against the purpose you need: sslserver, sslclient, smimesign, ... openssl verify -CAfile root.pem -purpose sslserver server.pem - 2.
Reemitir para a finalidade correta
Um certificado de servidor TLS precisa de serverAuth no extendedKeyUsage (se a extensão estiver presente) e de digitalSignature no keyUsage.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com" -addext "extendedKeyUsage=serverAuth"