Mensaje de error
verify error:num=18:self-signed certificate
También se muestra como
- verify error:num=18:self signed certificate
- Verify return code: 18 (self-signed certificate)
- error 18 at 0 depth lookup: self-signed certificate
OpenSSL 3.x imprime «self-signed»; 1.1.1, «self signed». s_client muestra «verify error:num=18:…» y «Verify return code: 18 (…)»; openssl verify muestra «error 18 at 0 depth lookup: …».
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
Qué significa
Error 18 de OpenSSL (X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT): el certificado de profundidad 0 es autofirmado —su emisor es él mismo— y no está en el almacén de confianza. No hay ninguna CA por encima de él, así que ningún intermedio ni bundle puede ayudar: hay que confiar directamente en el certificado o sustituirlo por uno emitido por una CA.
Por qué ocurre
El servidor usa un certificado autofirmado
frecuenteLos servidores de desarrollo, los dispositivos dedicados, las interfaces de administración y los servicios recién instalados suelen arrancar con un certificado generado.
Se sirve un certificado predeterminado para un nombre desconocido
ocasionalLos proxies inversos y los ingress responden a los nombres para los que no tienen configuración con un certificado autofirmado predeterminado; comprueba el SNI y el enrutamiento.
openssl verify ejecutado sobre un certificado raíz
ocasionalEjecutar openssl verify root.pem sin -CAfile root.pem notifica el error 18 para cualquier raíz autofirmada, incluso una válida.
Cómo solucionarlo
- 1.
Confirmar que el sujeto y el emisor son idénticos
Si el sujeto es igual al emisor, el certificado es autofirmado; lo que debes comparar con el valor esperado es su huella digital.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -issuer -fingerprint -sha256 # subject == issuer: self-signed - 2.
Confiar en ese certificado exacto para pruebas
Usar el propio certificado como -CAfile hace que OpenSSL acepte exactamente ese certificado. Antes, confirma la huella digital por un canal de confianza.
bash # Trust this exact certificate for a check (after confirming the fingerprint out of band) echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -out api.pem echo | openssl s_client -connect api.example.com:443 -servername api.example.com -CAfile api.pem 2>&1 | grep 'Verify return code' - 3.
Verificar una raíz contra sí misma
Una raíz autofirmada solo se verifica cuando es el ancla de confianza: pásala como -CAfile.
bash # Verifying a root CA certificate itself needs the root as its own trust anchor openssl verify -CAfile root.pem root.pem # root.pem: OK