Mensaje de error
verify error:num=10:certificate has expired
También se muestra como
- error 10 at 0 depth lookup: certificate has expired
- Verify return code: 10 (certificate has expired)
s_client imprime «verify error:num=10:certificate has expired» seguido de «notAfter=…»; openssl verify imprime «error 10 at <depth> depth lookup: certificate has expired». Los certificados que aún no son válidos dan el error 9, «certificate is not yet valid».
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_CERT_HAS_EXPIRED
Qué significa
Error 10 de OpenSSL (X509_V_ERR_CERT_HAS_EXPIRED): un certificado de la cadena tiene una fecha notAfter pasada respecto al momento de la verificación, que es la hora del reloj local salvo que se indique -attime. La línea de profundidad que se imprime junto con el error indica de qué certificado se trata: 0 es el propio del servidor; los números más altos son intermedios.
Por qué ocurre
El certificado del servidor caducó (profundidad 0)
frecuenteLa renovación falló, o el servidor o el balanceador de carga nunca cargaron el certificado renovado.
Caducó un intermedio de la cadena servida
ocasionalLos archivos de cadena antiguos siguen incluyendo un intermedio o un certificado de firma cruzada ya caducados aunque la CA los haya reemplazado; sustituye la cadena por la actual de la CA.
El reloj del equipo que verifica va adelantado
ocasionalUn reloj adelantado hace que certificados válidos parezcan caducados; -attime ayuda a distinguir los problemas de reloj de una caducidad real.
Cómo solucionarlo
- 1.
Identificar el certificado caducado
Lee las líneas de profundidad y notAfter; -checkend indica si un archivo de certificado caduca dentro de un número de segundos dado, algo útil para la monitorización.
bash # The depth printed with the error identifies the certificate; s_client also prints notAfter echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>&1 | grep -E '^depth|verify error|notAfter' # Check a file, and whether it expires within 30 days (exit 1 = yes) openssl x509 -in server.pem -noout -enddate -checkend 2592000 - 2.
Verificar en un momento elegido
openssl verify -attime <unix time> muestra si la cadena era válida en ese momento, lo que separa la caducidad de otros errores.
bash # Would the chain verify at another moment? (useful to separate clock problems) openssl verify -attime "$(date -d '2025-02-01' +%s)" -CAfile root.pem server.pem - 3.
Renovar y recargar
Renueva el certificado, recarga lo que termine TLS y confirma la nueva fecha de caducidad desde el lado de la red.
bash sudo certbot renew && sudo systemctl reload nginx echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -noout -enddate
Errores relacionados
curl: (60) SSL certificate problem: certificate has expiredcurl (OpenSSL backend)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has exp…Python ssl module (OpenSSL)certificate has expiredNode.js tls / https / fetch