¿Qué es un archivo Pem y en qué se diferencia de otros formatos de archivos de claves generados por OpenSSL?

Soy responsable del mantenimiento de dos servidores Debian. Cada vez que tengo que hacer algo con certificados de seguridad, busco tutoriales en Google y me pongo a machacar hasta que por fin funciona.

Sin embargo, en mis búsquedas me encuentro a menudo con diferentes formatos de archivo (.key, .csr, .pem) pero nunca he podido encontrar una buena explicación de cuál es el propósito de cada formato de archivo.

Me preguntaba si la buena gente aquí en ServerFault podría proporcionar alguna aclaración sobre este asunto.

Solución

El SSL existe desde hace mucho tiempo, por lo que se podría pensar que existen formatos de contenedores acordados. Y tiene razón, los hay. Hay demasiados estándares. Así que esto es lo que yo sé, y estoy seguro de que otros aportarán su opinión.

  • .csr - Se trata de una solicitud de firma de certificado. Algunas aplicaciones pueden generarlas para enviarlas a las autoridades de certificación. El formato actual es PKCS10, definido en RFC 2986. Incluye algunos o todos los detalles clave del certificado solicitado, como el asunto, la organización, el estado, etc., así como la clave pública del certificado que se va a firmar. Esto es firmado por la CA y se devuelve un certificado. El certificado devuelto es el certificado público (que incluye la clave pública pero no la privada), que puede estar en un par de formatos.
  • Definido en las RFCs 1421 a 1424, este es un formato contenedor que puede incluir sólo el certificado público (como en las instalaciones de Apache, y los archivos de certificado de la CA /etc/ssl/certs), o puede incluir una cadena de certificados completa incluyendo la clave pública, la clave privada y los certificados raíz. De forma confusa, también puede codificar un CSR (por ejemplo, como se utiliza aquí) ya que el formato PKCS10 puede traducirse a PEM. El nombre proviene de Privacy Enhanced Mail (PEM), un método fallido para el correo electrónico seguro, pero el formato contenedor que utilizaba sigue vivo, y es una traducción a base64 de las claves x509 ASN.1.
  • .key - Este es un archivo con formato PEM que contiene sólo la clave privada de un certificado específico y es simplemente un nombre convencional y no uno estandarizado. En las instalaciones de Apache, suele estar en /etc/ssl/private. Los derechos de estos archivos son muy importantes, y algunos programas se negarán a cargar estos certificados si están mal configurados.
  • .pkcs12 .pfx .p12 - Originalmente definido por RSA en el Public-Key Cryptography Standards (abreviado PKCS), la variante "12" fue originalmente mejorada por Microsoft, y más tarde presentada como RFC 7292. Se trata de un formato contenedor con contraseña que contiene pares de certificados públicos y privados. A diferencia de los archivos .pem, este contenedor está totalmente cifrado. Openssl puede convertirlo en un archivo .pem con claves públicas y privadas: openssl pkcs12 -in archivo-a-convertir.p12 -out archivo-convertido.pem -nodos

Algunos otros formatos que aparecen de vez en cuando:

  • .der - Una forma de codificar la sintaxis ASN.1 en binario, un archivo .pem es simplemente un archivo .der codificado en Base64. OpenSSL puede convertirlos en .pem (openssl x509 -inform der -in to-convert.der -out converted.pem). Windows los ve como archivos de certificado. Por defecto, Windows exportará los certificados como archivos con formato .DER con una extensión diferente. Como...
  • .cert .cer .crt - Un archivo con formato .pem (o raramente .der) con una extensión diferente, una que es reconocida por el Explorador de Windows como un certificado, que no es .pem.
  • .p7b .keystore* - Definido en RFC 2315 como PKCS número 7, es un formato utilizado por Windows para el intercambio de certificados. Java lo entiende de forma nativa, y a menudo utiliza .keystore como extensión en su lugar. A diferencia de los certificados de estilo .pem, este formato tiene una forma definida* de incluir certificados de ruta de certificación.
  • .crl** - Una lista de revocación de certificados. Las Autoridades de Certificación las producen como una forma de desautorizar los certificados antes de su vencimiento. A veces se pueden descargar de los sitios web de las CA.

En resumen, hay cuatro formas diferentes de presentar los certificados y sus componentes:

  • PEM - Regido por RFCs, es utilizado preferentemente por el software de código abierto. Puede tener una variedad de extensiones (.pem, .key, .cer, .cert, etc.)
  • PKCS7 - Un estándar abierto utilizado por Java y soportado por Windows. No contiene material de clave privada.
  • PKCS12 - Un estándar privado de Microsoft que se definió posteriormente en una RFC que proporciona una mayor seguridad frente al formato PEM de texto plano. Puede contener material de clave privada. Es utilizado preferentemente por los sistemas Windows, y puede ser convertido libremente al formato PEM mediante el uso de openssl.
  • DER - El formato padre de PEM. Es útil pensar en él como una versión binaria del archivo PEM codificado en base64. No se utiliza mucho fuera de Windows.

Espero que esto ayude.

Comentarios (20)

PEM por sí solo no es un certificado, es sólo una forma de codificar datos. Los certificados X.509 son un tipo de datos que suele codificarse con PEM.

PEM es un certificado X.509 (cuya estructura se define utilizando ASN.1), codificado utilizando el DER (reglas de codificación distinguidas) de ASN.1, luego pasado por la codificación Base64 y metido entre líneas de anclaje de texto plano (BEGIN CERTIFICATE y END CERTIFICATE).

Se pueden representar los mismos datos utilizando las representaciones PKCS#7 o PKCS#12, y para ello se puede utilizar la utilidad de línea de comandos openssl.

Las ventajas obvias de PEM es que es seguro para pegar en el cuerpo de un mensaje de correo electrónico porque tiene líneas de anclaje y es de 7 bits.

El documento RFC1422 tiene más detalles sobre el estándar PEM en relación con las claves y los certificados.

Comentarios (2)