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


1344

Soy responsable de mantener dos servidores Debian. Cada vez que tengo que hacer algo con certificados de seguridad, busco tutoriales en Google y me alejo hasta que finalmente funciona.

Sin embargo, en mis búsquedas vengo a menudo a través de diferentes formatos de archivo ( .key, .csr, .pem) pero nunca he sido capaz de encontrar una buena explicación de lo que el propósito de cada formato de archivo es.

Me preguntaba si las buenas personas aquí en ServerFault podrían proporcionar alguna aclaración sobre este asunto.


Respuestas:


1656

SSL ha existido durante el tiempo suficiente como para pensar que se acordarían los formatos de contenedor. Y tienes razón, las hay. Demasiados estándares como sucede. Así que esto es lo que sé, y estoy seguro de que otros intervendrán.

  • .csr : esta es una solicitud de firma de certificado. Algunas aplicaciones pueden generarlos para enviarlos a las autoridades de certificación. El formato real es PKCS10, que se define en RFC 2986 . Incluye algunos / todos los detalles clave del certificado solicitado, como el asunto, la organización, el estado, lo que sea, así como la clave pública del certificado para firmar. La CA los firma y se devuelve un certificado. El certificado devuelto es el certificado público (que incluye la clave pública pero no la clave privada), que puede estar en un par de formatos.
  • .pem : definido en los RFC 1421 a 1424 , este es un formato de contenedor que puede incluir solo el certificado público (como con las instalaciones de Apache y los archivos de certificado de CA /etc/ssl/certs), o puede incluir una cadena de certificados completa que incluye clave pública, clave privada y certificados raíz Confusamente, también puede codificar una CSR (por ejemplo, como se usa aquí ) ya que el formato PKCS10 se puede traducir a PEM. El nombre es de Privacy Enhanced Mail (PEM) , un método fallido para el correo electrónico seguro, pero el formato del contenedor en el que se utiliza, y es una traducción en base64 de las claves x509 ASN.1.
  • .key : este es un archivo con formato PEM que contiene solo la clave privada de un certificado específico y es simplemente un nombre convencional y no uno estandarizado. En las instalaciones de Apache, esto reside con frecuencia en /etc/ssl/private. Los derechos sobre estos archivos son muy importantes, y algunos programas se negarán a cargar estos certificados si están configurados incorrectamente.
  • .pkcs12 .pfx .p12 : Originalmente definido por RSA en los Estándares de criptografía de clave pública (abreviado PKCS), la variante "12" fue originalmente mejorada por Microsoft y luego se presentó como RFC 7292 . Este es un formato de contenedor con contraseña que contiene pares de certificados públicos y privados. A diferencia de los archivos .pem, este contenedor está completamente encriptado. Openssl puede convertir esto en un archivo .pem con claves públicas y privadas:openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes

Algunos otros formatos que aparecen de vez en cuando:

  • .der : una forma de codificar la sintaxis ASN.1 en binario, un archivo .pem es solo un archivo .der codificado en Base64. OpenSSL puede convertirlos a .pem ( openssl x509 -inform der -in to-convert.der -out converted.pem). Windows los ve como archivos de certificado. De manera predeterminada, Windows exportará los certificados como archivos con formato .DER con una extensión diferente. Me gusta...
  • .cert .cer .crt : un archivo formateado .pem (o rara vez .der) con una extensión diferente, que el Explorador de Windows reconoce como un certificado, que no es .pem.
  • .p7b .keystore : definido en RFC 2315 como PKCS número 7, este es un formato utilizado por Windows para el intercambio de certificados. Java los entiende de forma nativa y, en su lugar, los utiliza a menudo .keystorecomo una extensión. 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 los producen como una forma de desautorizar los certificados antes de su vencimiento. A veces puede descargarlos de los sitios web de CA.

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

  • PEM : gobernado por RFC, se utiliza preferentemente por software de código abierto. Puede tener una variedad de extensiones (.pem, .key, .cer, .cert, más)
  • PKCS7 : un estándar abierto utilizado por Java y compatible con Windows. No contiene material de clave privada.
  • PKCS12 : un estándar privado de Microsoft que luego se definió en un RFC que proporciona seguridad mejorada en comparación con el formato PEM de texto sin formato. Esto puede contener material de clave privada. Se usa preferentemente por los sistemas Windows, y se puede convertir libremente al formato PEM mediante el uso de openssl.
  • DER - El formato padre de PEM. Es útil considerarlo como una versión binaria del archivo PEM codificado en base64. No se usa habitualmente mucho fuera de Windows.

Espero que esto ayude.


297
La gran cosa acerca de los estándares es que hay tantos para elegir ...
squillman

36
.crt es otra extensión común para .cert y .cer
David Pashley

44
PEM es un formato de archivo que puede consistir en un certificado (también conocido como clave pública), una clave privada o, de hecho, ambos concatenados juntos. No prestes tanta atención a la extensión del archivo; significa Correo mejorado de privacidad, un uso para el que no veía mucho uso, pero el formato de archivo se quedó.
Dan Carley

20
Respuesta muy útil, pero no creo que hayas cubierto el formato .pub creado por ssh-keygen. Sería útil saber cómo se relaciona eso con el resto.
Jez

24
No puedo evitar notar que "Correo electrónico mejorado de privacidad" daría el acrónimo "PEE" en lugar de "PEM". Los RFC tienden a usar la frase "Correo mejorado de privacidad"
aidan

141

PEM por sí solo no es un certificado, es solo una forma de codificar datos. Los certificados X.509 son un tipo de datos que comúnmente se codifican con PEM.

PEM es un certificado X.509 (cuya estructura se define utilizando ASN.1), codificado utilizando el ASN.1 DER (reglas de codificación distinguidas), luego se ejecuta a través de la codificación Base64 y se atasca entre líneas de anclaje de texto sin formato (BEGIN CERTIFICATE y END CERTIFICATE )

Puede representar los mismos datos usando las representaciones PKCS # 7 o PKCS # 12, y la utilidad de línea de comandos openssl puede usarse para hacer esto.

Los beneficios obvios de PEM es que es seguro pegarlo en el cuerpo de un mensaje de correo electrónico porque tiene líneas de anclaje y está limpio en 7 bits.

RFC1422 tiene más detalles sobre el estándar PEM en lo que se refiere a claves y certificados.


1
¿Cómo haces esto "usando la línea de comando openssl"?
Samik R

2
Para convertir un archivo DER (.cer .crt .der) a PEM: openssl x509 -inform der -in cert.cer -out cert.pem. Para convertir un archivo PEM a DER: openssl x509 -outform der -in cert.pem -out certi.der. Para convertir un archivo PKCS # 12 (.pfx p.12) que contiene una clave privada y certificados a PEM: openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes. Para convertir un archivo de certificado PEM y una clave privada a PKCS # 12 (.pfx .p12): openssl pkcs12 -export -out cert.pfx -inkey privateKey.key -in cert.crt -certfile CACert.crtDesde aquí
mpeac

55

A veces un .crtarchivo ya es un .pem. Ver: https://stackoverflow.com/questions/991758/openssl-pem-key


44
De hecho cierto, acabo de notar esto hoy. Tuve que ingresar un certificado PEM en Rackspace Loadbalancer y me preguntaba si el CRT generado estaba en ese formato. Pero funcionó así, así que esa fue mi conclusión también, la mayoría de estos .crt vienen en formato PEM, parece.
Glenn Plas

@GlennPlas se enfoca en lugar del contenido del archivo, no su nombre o extensión. Podría llamarse .foobarpara todo lo que importa ...
Patrick Mevzek