Saltar al contenido
ecdsa.com
OpenSSL CLI (openssl s_client)CLI de OpenSSL

Mensaje de error

verify error:num=21:unable to verify the first certificate

También se muestra como

  • Verify return code: 21 (unable to verify the first certificate)

openssl s_client lo imprime como «verify error:num=21:…» y «Verify return code: 21 (…)». Node.js notifica la misma situación como UNABLE_TO_VERIFY_LEAF_SIGNATURE («unable to verify the first certificate»).

OpenSSL CLI (openssl s_client) — X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE

Qué significa

Error 21 de OpenSSL (X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE): la cadena consta de un único certificado, el propio del servidor, y no se encontró su emisor, así que ni siquiera se puede comprobar la firma del certificado hoja. s_client suele imprimir justo antes el error 20 para la profundidad 0. La solución está casi siempre en el servidor: debe enviar su certificado intermedio.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Comprobar qué envía el servidor

    Un único certificado cuyo emisor (i:) es una CA intermedia confirma el problema.

    bash
    openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \
      | grep -E '^ *[0-9]+ s:|^ *i:'
  2. 2.

    Servir el certificado hoja + los intermedios

    Concatena en orden el certificado hoja y el intermedio o los intermedios emisores, y configura el servidor con ese archivo; imprime el bundle para comprobar el orden.

    bash
    # Build the file the server should use: leaf, then intermediates (issuer of each previous one)
    cat server.pem intermediate.pem > fullchain.pem
    openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout   # check the order
  3. 3.

    Encontrar el intermedio correcto

    La extensión Authority Information Access del certificado hoja indica la URL del certificado de su emisor; descárgalo, conviértelo a PEM si hace falta y añádelo al archivo de la cadena.

    bash
    # Where to download the missing intermediate: the leaf's Authority Information Access URL
    openssl x509 -in server.pem -noout -ext authorityInfoAccess
    curl -sS -o intermediate.der http://ca.example.com/issuing-ca.crt
    openssl x509 -inform der -in intermediate.der -out intermediate.pem

Errores relacionados

Explorar toda la base de datos de errores de firma