Wat is een Pem bestand en hoe verschilt het van andere OpenSSL gegenereerde sleutel bestandsformaten?

Ik ben verantwoordelijk voor het onderhoud van twee Debian servers. Elke keer als ik iets met beveiligingscertificaten moet doen, Google ik naar tutorials en sla net zo lang tot het eindelijk werkt.

Echter, in mijn zoektochten kom ik vaak verschillende bestandsformaten tegen (.key, .csr, .pem) maar ik'heb nooit een goede uitleg kunnen vinden over wat het doel is van elk bestandsformaat's.

Ik vroeg me af of de goede mensen hier op ServerFault wat opheldering zouden kunnen verschaffen over deze kwestie?

Oplossing

SSL bestaat al lang genoeg om te denken dat er overeengekomen containerformaten zouden zijn. En je hebt gelijk, die zijn er. Te veel normen, toevallig. Dus dit is wat ik weet, en ik weet zeker dat anderen mee zullen doen.

  • .csr - Dit is een Certificate Signing Request. Sommige applicaties kunnen deze genereren om in te dienen bij certificaat-autoriteiten. Het eigenlijke formaat is PKCS10, dat wordt gedefinieerd in RFC 2986. Het bevat enkele of alle belangrijke details van het aangevraagde certificaat, zoals onderwerp, organisatie, land, wat al niet meer, en de publieke sleutel van het certificaat dat ondertekend moet worden. Deze worden ondertekend door de CA en er wordt een certificaat teruggestuurd. Het geretourneerde certificaat is het openbare certificaat (dat de openbare sleutel bevat, maar niet de privé-sleutel), dat zelf in een paar formaten kan zijn.
  • .pem - Gedefinieerd in RFCs 1421 tot 1424, dit is een containerformaat dat enkel het publiek certificaat kan bevatten (zoals bij Apache installaties, en CA certificaatbestanden /etc/ssl/certs), of het kan een volledige certificaatketen bevatten inclusief publieke sleutel, private sleutel, en root certificaten. Verwarrend genoeg kan het ook een CSR coderen (bv. zoals hier gebruikt hier) aangezien het PKCS10 formaat kan worden vertaald naar PEM. De naam komt van Privacy Enhanced Mail (PEM), een mislukte methode voor beveiligde e-mail, maar het gebruikte containerformaat leeft voort, en is een base64 vertaling van de x509 ASN.1 sleutels.
  • .key - Dit is een PEM-geformatteerd bestand dat alleen de private-key van een specifiek certificaat bevat en slechts een conventionele naam is en geen gestandaardiseerde. In Apache installaties staat dit vaak in /etc/ssl/private. De rechten op deze bestanden zijn erg belangrijk, en sommige programma's zullen weigeren om deze certificaten te laden als ze verkeerd zijn ingesteld.
  • .pkcs12 .pfx .p12 - Oorspronkelijk gedefinieerd door RSA in de Public-Key Cryptography Standards (afgekort PKCS), de "12" variant werd oorspronkelijk verbeterd door Microsoft, en later ingediend als RFC 7292. Dit is een containerformaat met een wachtwoord dat zowel openbare als privé-certificaatparen bevat. In tegenstelling tot .pem-bestanden is deze container volledig versleuteld. Openssl kan dit omzetten in een .pem bestand met zowel publieke als private sleutels: openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes

Een paar andere formaten die van tijd tot tijd opduiken:

  • .der - Een manier om ASN.1 syntax in binair te coderen, een .pem bestand is gewoon een Base64 gecodeerd .der bestand. OpenSSL kan deze omzetten naar .pem (openssl x509 -inform der -in to-convert.der -out converted.pem). Windows ziet deze als Certificaat bestanden. Standaard exporteert Windows certificaten als .DER-geformatteerde bestanden met een andere extensie. Zoals...
  • .cert .cer .crt - Een .pem (of zelden .der) geformatteerd bestand met een andere extensie, een die door Windows Verkenner wordt herkend als een certificaat, wat .pem niet is.
  • .p7b .keystore - Gedefinieerd in RFC 2315 als PKCS nummer 7, dit is een formaat dat door Windows wordt gebruikt voor het uitwisselen van certificaten. Java begrijpt deze van nature, en gebruikt in plaats daarvan vaak .keystore als extensie. In tegenstelling tot .pem-stijl certificaten, heeft dit formaat een gedefinieerde manier om certificatie-pad certificaten op te nemen.
  • .crl - Een herroepingslijst van certificaten. Certificaatautoriteiten produceren deze als een manier om certificaten te de-autoriseren voordat ze verlopen. U kunt ze soms downloaden van CA-websites.

Samenvattend zijn er vier verschillende manieren om certificaten en hun componenten te presenteren:

  • PEM - Geregeerd door RFC's, wordt bij voorkeur gebruikt door open-source software. Het kan een verscheidenheid aan extensies hebben (.pem, .key, .cer, .cert, meer)
  • PKCS7 - Een open standaard die door Java wordt gebruikt en door Windows wordt ondersteund. Bevat geen private key materiaal.
  • PKCS12 - Een privéstandaard van Microsoft die later werd gedefinieerd in een RFC die een verbeterde beveiliging biedt ten opzichte van het PEM-formaat (platte tekst). Dit kan private key-materiaal bevatten. Het wordt bij voorkeur gebruikt door Windows-systemen en kan vrij worden geconverteerd naar PEM-formaat met behulp van openssl.
  • DER - Het bovenliggende formaat van PEM. Het is nuttig om het te zien als een binaire versie van het base64-gecodeerde PEM-bestand. Wordt buiten Windows niet veel gebruikt.

Ik hoop dat dit helpt.

Commentaren (20)

PEM op zich is geen certificaat, het is slechts een manier om gegevens te coderen. X.509-certificaten zijn een type gegevens dat gewoonlijk met PEM wordt gecodeerd.

PEM is een X.509-certificaat (waarvan de structuur is gedefinieerd met ASN.1), gecodeerd met de ASN.1 DER (distinguished encoding rules), dan door Base64-codering gehaald en tussen ankerregels in platte tekst geplakt (BEGIN CERTIFICATE en END CERTIFICATE).

Je kan dezelfde gegevens weergeven met de PKCS#7 of PKCS#12 representaties, en het openssl commandoregel hulpprogramma kan gebruikt worden om dit te doen.

De voor de hand liggende voordelen van PEM is dat het veilig in de body van een e-mailbericht kan worden geplakt omdat het ankerregels heeft en 7-bit schoon is.

RFC1422 bevat meer details over de PEM-standaard met betrekking tot sleutels en certificaten.

Commentaren (2)