bitlvl
ES

Decodificador de certificados SSL y CSR

Pega uno o varios bloques PEM. Cada certificado se decodifica como con openssl x509 -text, señalando los problemas de los que se quejarían los navegadores. Las claves privadas se rechazan y nunca hacen falta.

Obtén el tuyo con: openssl s_client -connect example.com:443 -showcerts </dev/null

Los resultados y mensajes de esta herramienta se muestran en inglés.

Qué hay en un certificado

Un certificado X.509 vincula una clave pública a un nombre, firmado por un emisor. Los campos que importan cuando algo no funciona:

  • Subject Alternative Name: la lista de nombres de host (e IP) para los que el certificado es válido. Los navegadores ignoran por completo el Common Name; un certificado sin el nombre de host en su SAN falla con NET::ERR_CERT_COMMON_NAME_INVALID diga lo que diga el CN.
  • Validez: notBefore y notAfter. Los certificados finales de confianza pública pueden durar como máximo 398 días (reduciéndose a 47 en 2029); Let’s Encrypt emite certificados de 90 días.
  • Emisor y la cadena: un servidor debe enviar su certificado final más cada intermedio hasta (pero sin incluir) una raíz en la que confíe el cliente. «Unable to get local issuer certificate» casi siempre significa que falta un intermedio.
  • Key usage / extended key usage: un certificado de servidor necesita TLS server auth; una CA necesita keyCertSign y CA:TRUE en basic constraints.
  • Authority Information Access: de dónde obtener el certificado del emisor y el respondedor OCSP; CRL distribution points: dónde están las listas de revocación.
  • Algoritmo de firma: hoy sha256WithRSA, ecdsa-with-SHA256 o Ed25519; las firmas SHA-1 se rechazan en todas partes.

Huellas

La huella SHA-256 es el hash de todo el certificado codificado en DER, usada para pinning y para comparar lo que envía un servidor con lo que esperas (openssl x509 -fingerprint -sha256). Cambia con cada renovación, por eso hacer pinning de certificados finales es frágil; haz pinning de la clave pública (SPKI) o de un intermedio.

CSR

Una solicitud de firma de certificado contiene el sujeto, la clave pública y las extensiones solicitadas, firmada con la clave privada correspondiente como prueba de posesión. Las CA copian el SAN de la solicitud (o de los dominios validados) e ignoran casi todo lo demás. Comprobar un CSR antes de enviarlo ahorra un viaje cuando el SAN está mal.

Obtener el PEM

openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null | openssl x509   # solo el final
openssl s_client -connect example.com:443 -showcerts </dev/null 2>/dev/null | sed -n '/BEGIN/,/END/p'                   # toda la cadena
openssl x509 -in cert.der -inform der -out cert.pem                                                                        # DER → PEM

Preguntas

¿Puedo pegar un archivo .crt, .cer o .der?

Pega el texto de los archivos PEM (.pem, .crt, .cer cuando empiezan por -----BEGIN). El DER binario hay que convertirlo primero: openssl x509 -inform der -in archivo -out archivo.pem. También se acepta el Base64 en bruto de un certificado DER sin las líneas BEGIN/END.

¿Por qué el decodificador dice que el CN no está en el SAN?

Los navegadores solo comprueban el SAN. Un certificado con CN=example.com pero SAN=www.example.com no funcionará para example.com. Reemítelo con todos los nombres de host en el SAN.

¿Qué significa aquí «autofirmado»?

El emisor y el sujeto son idénticos. Es normal para una CA raíz y para certificados de desarrollo, pero los navegadores rechazarán un certificado final autofirmado salvo que esté instalado como de confianza.

¿Se envía mi certificado a un servidor?

No. La decodificación usa un analizador ASN.1 escrito en JavaScript y se ejecuta en tu navegador. Aun así, las claves privadas se rechazan de inmediato; un certificado es público por naturaleza, una clave nunca.