Mensaje de error
verify error:num=26:unsuitable certificate purpose
También se muestra como
- Verify return code: 26 (unsuitable certificate purpose)
- error 26 at 0 depth lookup: unsuitable certificate purpose
s_client imprime «verify error:num=26:…» y «Verify return code: 26 (…)»; openssl verify imprime «error 26 at <depth> depth lookup: unsuitable certificate purpose». Go notifica el mismo problema como «x509: certificate specifies an incompatible key usage».
OpenSSL CLI (openssl s_client / openssl verify -purpose) — X509_V_ERR_INVALID_PURPOSE
Qué significa
Error 26 de OpenSSL (X509_V_ERR_INVALID_PURPOSE): por lo demás, la cadena es válida, pero las extensiones de un certificado no permiten el propósito que se comprueba. s_client comprueba el certificado del servidor para el propósito de servidor TLS, así que falla un certificado cuyo extendedKeyUsage solo incluye clientAuth (o emailProtection); openssl verify comprueba el -purpose que le indiques.
Por qué ocurre
El extendedKeyUsage no incluye serverAuth
frecuenteCertificados de plantillas de autenticación de cliente o de S/MIME instalados en un servidor, o un EKU escrito a mano sin serverAuth.
Se usa un certificado de CA como certificado de servidor
ocasionalServir un certificado con un keyUsage limitado a keyCertSign/cRLSign no supera las comprobaciones del propósito de servidor TLS.
El EKU de un intermedio excluye el propósito
ocasionalOpenSSL comprueba los propósitos a lo largo de la cadena hacia arriba; un intermedio restringido a otros usos hace que sus certificados hoja no sirvan para servidores TLS.
Cómo solucionarlo
- 1.
Leer las extensiones de uso
extendedKeyUsage, keyUsage y basicConstraints indican para qué se puede usar el certificado; openssl verify -purpose comprueba un propósito concreto.
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.
Volver a emitir para el propósito correcto
Un certificado de servidor TLS necesita serverAuth en extendedKeyUsage (si la extensión existe) y digitalSignature en 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"