Qu'est-ce qu'un fichier PEM et en quoi est-il différent des autres formats de fichiers de clés générés par OpenSSL?

1344

Je suis responsable de la maintenance de deux serveurs Debian. Chaque fois que je dois faire quelque chose avec des certificats de sécurité, je Google pour des tutoriels et repousser jusqu'à ce que cela fonctionne enfin.

Cependant, dans mes recherches , je souvent rencontré différents formats de fichiers ( .key, .csr, .pem) mais je ne l' ai jamais été en mesure de trouver une bonne explication de ce que le but de chaque format de fichier est.

Je me demandais si les gens bien ici chez ServerFault pourraient fournir des éclaircissements sur ce sujet?

Noah Goodrich
la source

Réponses:

1656

SSL existe depuis assez longtemps pour que vous pensiez qu'il existe des formats de conteneur convenus. Et vous avez raison, il y en a. Trop de normes comme cela se produit. C’est donc ce que je sais et je suis sûr que d’autres y participeront.

  • .csr - Ceci est une demande de signature de certificat. Certaines applications peuvent en générer pour les soumettre aux autorités de certification. Le format actuel est PKCS10, défini dans la RFC 2986 . Il inclut une partie / la totalité des détails de clé du certificat demandé, tels que le sujet, l'organisation, l'état, etc., ainsi que la clé publique du certificat à signer. Ceux-ci sont signés par l'autorité de certification et un certificat est renvoyé. Le certificat renvoyé est le certificat public (qui inclut la clé publique mais pas la clé privée), qui peut être lui-même sous deux formats.
  • .pem - Défini dans les RFC 1421 à 1424 , il s’agit d’un format de conteneur pouvant inclure uniquement le certificat public (comme avec les installations Apache et les fichiers de certificat d’autorité de certification /etc/ssl/certs), ou peut inclure une chaîne de certificats complète comprenant une clé publique, une clé privée et certificats racine. De manière confuse, il peut également coder un CSR (par exemple, tel qu’il est utilisé ici ) car le format PKCS10 peut être traduit en PEM. Le nom vient de Privacy Enhanced Mail (PEM) , une méthode ayant échoué pour la messagerie sécurisée, mais le format de conteneur utilisé est toujours valide. Il s'agit d'une traduction en base64 des clés x509 ASN.1.
  • .key - Il s’agit d’un fichier au format PEM contenant uniquement la clé privée d’un certificat spécifique. Il s’agit simplement d’un nom conventionnel et non normalisé. Dans les installations Apache, cela réside souvent dans /etc/ssl/private. Les droits sur ces fichiers sont très importants et certains programmes refuseront de charger ces certificats s’ils sont mal réglés.
  • .pkcs12 .pfx .p12 - Définie à l'origine par RSA dans les standards de cryptographie à clé publique (PKCS abrégé), la variante "12" a été améliorée à l'origine par Microsoft, puis soumise ultérieurement sous le numéro RFC 7292 . Il s'agit d'un format de conteneur avec mot de passe contenant les paires de certificats publics et privés. Contrairement aux fichiers .pem, ce conteneur est entièrement chiffré. Openssl peut transformer cela en un fichier .pem avec des clés publiques et privées:openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes

Quelques autres formats qui apparaissent de temps en temps:

  • .der - Un moyen de coder la syntaxe ASN.1 en binaire, un fichier .pem est simplement un fichier .der codé en Base64. OpenSSL peut les convertir en .pem ( openssl x509 -inform der -in to-convert.der -out converted.pem). Windows les considère comme des fichiers de certificat. Par défaut, Windows exportera les certificats sous forme de fichiers au format .DER avec une extension différente. Comme...
  • .cert .cer .crt - Fichier au format .pem (ou rarement .der) portant une extension différente, reconnu par l'explorateur Windows comme un certificat, contrairement à .pem.
  • .p7b .keystore - Défini dans le RFC 2315 en tant que PKCS numéro 7, il s'agit d'un format utilisé par Windows pour l'échange de certificats. Java les comprend de manière native et les utilise souvent .keystorecomme une extension. Contrairement aux certificats de style .pem, ce format comporte une méthode définie pour inclure les certificats de chemin de certification.
  • .crl - Une liste de révocation de certificats. Les autorités de certification les utilisent comme moyen de désautoriser les certificats avant leur expiration. Vous pouvez parfois les télécharger à partir des sites Web de CA.

En résumé, il existe quatre manières différentes de présenter les certificats et leurs composants:

  • PEM - Régi par les RFC, il est utilisé préférentiellement par les logiciels open source. Il peut avoir une variété d'extensions (.pem, .key, .cer, .cert, etc.)
  • PKCS7 - Norme ouverte utilisée par Java et prise en charge par Windows. Ne contient pas de matériel de clé privée.
  • PKCS12 - Norme privée de Microsoft définie ultérieurement dans un RFC offrant une sécurité renforcée par rapport au format PEM en texte brut. Cela peut contenir du matériel de clé privée. Il est utilisé préférentiellement par les systèmes Windows et peut être librement converti au format PEM via OpenSL.
  • DER - Le format parent de PEM. Il est utile de le considérer comme une version binaire du fichier PEM codé en base64. Pas couramment utilisé en dehors de Windows.

J'espère que ça aide.

sysadmin1138
la source
297
La grande chose à propos des normes, c'est qu'il y a tellement de choix ...
squillman,
36
.crt est une autre extension courante de .cert et .cer
David Pashley le
44
PEM est un format de fichier qui peut consister en un certificat (ou clé publique), une clé privée ou les deux concaténés. Ne faites pas trop attention à l’extension du fichier; cela veut dire Privacy Enhanced Mail, une utilisation pour laquelle il n’a pas été très utile mais le format de fichier est resté inchangé.
Dan Carley
20
Réponse très utile, mais je ne pense pas que vous ayez couvert le format .pub créé par ssh-keygen. Il serait utile de savoir comment cela s’associe au reste.
Jez
24
Je ne peux pas m'empêcher de remarquer que "Privacy Enhanced Email" donnerait l'acronyme "PEE" par opposition à "PEM". Les RFC ont tendance à utiliser l'expression "Privacy Enhanced Mail"
Aide du
141

PEM seul n'est pas un certificat, c'est simplement une manière d'encoder des données. Les certificats X.509 sont un type de données couramment codé à l'aide de PEM.

PEM est un certificat X.509 (dont la structure est définie à l'aide de ASN.1), codé à l'aide des règles de codage différenciées ASN.1, puis exécuté par le codage Base64 et bloqué entre des lignes d'ancrage en texte brut (BEGIN CERTIFICATE et END CERTIFICATE ).

Vous pouvez représenter les mêmes données à l'aide des représentations PKCS # 7 ou PKCS # 12, à l'aide de l'utilitaire de ligne de commande openssl.

Les avantages évidents de PEM sont qu'il est sûr de coller dans le corps d'un e-mail, car il comporte des lignes d'ancrage et est propre 7 bits.

La RFC1422 contient plus de détails sur la norme PEM en ce qui concerne les clés et les certificats.

James F
la source
1
Comment faites-vous cela "en utilisant la ligne de commande openssl"?
Samik R
2
Pour convertir un fichier DER (.cer .crt .der) à PEM: openssl x509 -inform der -in cert.cer -out cert.pem. Pour convertir un fichier PEM à DER: openssl x509 -outform der -in cert.pem -out certi.der. Pour convertir un fichier PKCS # 12 (.pfx p12) contenant une clé privée et certificats PEM: openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes. Pour convertir un fichier de certificat PEM et une clé privée en PKCS # 12 (.pfx .p12): openssl pkcs12 -export -out cert.pfx -inkey privateKey.key -in cert.crt -certfile CACert.crtÀ partir d' ici
mpeac
55

Parfois, un .crtfichier est déjà un fichier .pem. Voir: https://stackoverflow.com/questions/991758/openssl-pem-key

mgold
la source
4
En effet vrai, je viens de remarquer cela aujourd'hui. Je devais entrer un certificat PEM dans rackload Loadbalancer et je me demandais si le crt généré était dans ce format. Mais cela a fonctionné comme ça, donc c'était aussi ma conclusion, la plupart de ces .crt sont en format PEM, semble-t-il.
Glenn Plas
@GlennPlas focus au lieu du contenu du fichier, ni de son nom ni de son extension. Il pourrait être appelé .foobarpour tout ce qui compte ...
Patrick Mevzek