Cos'è un file Pem e come differisce da altri formati di file di chiavi generate da OpenSSL?

Sono responsabile della manutenzione di due server Debian. Ogni volta che devo fare qualcosa con i certificati di sicurezza, cerco su Google dei tutorial e picchio finché finalmente funziona.

Tuttavia, nelle mie ricerche mi imbatto spesso in diversi formati di file (.key, .csr, .pem) ma non sono mai stato in grado di trovare una buona spiegazione di ciò che ogni formato di file ha lo scopo.

Mi chiedevo se le brave persone qui a ServerFault potessero fornire qualche chiarimento su questo argomento?

Soluzione

SSL è stato in giro abbastanza a lungo da farvi pensare che ci siano formati di contenitori concordati. E hai ragione, ci sono. Si dà il caso che ci siano troppi standard. Quindi questo è quello che so, e sono sicuro che altri interverranno.

  • .csr - Questo è un Certificate Signing Request. Alcune applicazioni possono generarle per presentarle alle autorità di certificazione. Il formato attuale è PKCS10 che è definito in RFC 2986. Include alcuni o tutti i dettagli chiave del certificato richiesto, come soggetto, organizzazione, stato, eccetera, così come la chiave pubblica del certificato da firmare. Questi vengono firmati dalla CA e viene restituito un certificato. Il certificato restituito è il certificato pubblico (che include la chiave pubblica ma non la chiave privata), che può essere in un paio di formati.
  • .pem - Definito nelle RFC da 1421 a 1424, questo è un formato contenitore che può includere solo il certificato pubblico (come nelle installazioni di Apache, e nei file dei certificati CA /etc/ssl/certs), o può includere un'intera catena di certificati che include chiave pubblica, chiave privata e certificati di root. Confusamente, può anche codificare un CSR (ad esempio come usato qui) poiché il formato PKCS10 può essere tradotto in PEM. Il nome deriva da Privacy Enhanced Mail (PEM), un metodo fallito per la posta elettronica sicura, ma il formato contenitore che usava vive ancora, ed è una traduzione base64 delle chiavi x509 ASN.1.
  • .key - Questo è un file in formato PEM che contiene solo la chiave privata di un certificato specifico ed è semplicemente un nome convenzionale e non standardizzato. Nelle installazioni di Apache, questo spesso risiede in /etc/ssl/private. I diritti su questi file sono molto importanti, e alcuni programmi rifiuteranno di caricare questi certificati se sono impostati male.
  • .pkcs12 .pfx .p12 - Originariamente definito da RSA nel Public-Key Cryptography Standards (abbreviato PKCS), la variante "12" è stata originariamente migliorata da Microsoft, e successivamente presentata come RFC 7292. Questo è un formato contenitore con password che contiene coppie di certificati pubblici e privati. A differenza dei file .pem, questo contenitore è completamente criptato. Openssl può trasformarlo in un file .pem con entrambe le chiavi pubbliche e private: openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes.

Qualche altro formato che si presenta di tanto in tanto:

  • .der - Un modo per codificare la sintassi ASN.1 in binario, un file .pem è solo un file .der codificato in Base64. OpenSSL può convertirli in .pem (openssl x509 -inform der -in to-convert.der -out converted.pem). Windows li vede come file di certificato. Per default, Windows esporterà i certificati come file formattati .DER con un'estensione diversa. Come...
  • .cert .cer .crt - Un file formattato .pem (o raramente .der) con un'estensione diversa, uno che viene riconosciuto da Windows Explorer come un certificato, cosa che .pem non è.
  • .p7b .keystore - Definito in RFC 2315 come PKCS numero 7, questo è un formato usato da Windows per lo scambio di certificati. Java li capisce nativamente, e spesso usa invece l'estensione .keystore. A differenza dei certificati in stile .pem, questo formato ha un modo definito per includere i certificati del percorso di certificazione.
  • .crl - Una lista di revoca dei certificati. Le autorità di certificazione li producono come un modo per de-autorizzare i certificati prima della scadenza. A volte è possibile scaricarli dai siti web delle CA.

In sintesi, ci sono quattro modi diversi di presentare i certificati e i loro componenti:

  • PEM - Governato da RFC, è usato di preferenza dal software open-source. Può avere una varietà di estensioni (.pem, .key, .cer, .cert, altro)
  • PKCS7 - Uno standard aperto usato da Java e supportato da Windows. Non contiene materiale di chiavi private.
  • PKCS12 - Uno standard privato di Microsoft che è stato successivamente definito in un RFC che fornisce una maggiore sicurezza rispetto al formato PEM in chiaro. Questo può contenere materiale di chiave privata. È usato di preferenza dai sistemi Windows, e può essere liberamente convertito in formato PEM attraverso l'uso di openssl.
  • DER - Il formato padre del PEM. È utile pensarlo come una versione binaria del file PEM codificato in base64. Non è usato abitualmente molto al di fuori di Windows.

Spero che questo aiuti.

Commentari (20)

Il PEM da solo non è un certificato, è solo un modo di codificare i dati. I certificati X.509 sono un tipo di dati che vengono comunemente codificati usando il PEM.

Il PEM è un certificato X.509 (la cui struttura è definita usando ASN.1), codificato usando l'ASN.1 DER (distinguished encoding rules), poi fatto passare attraverso la codifica Base64 e bloccato tra linee di ancoraggio di testo semplice (BEGIN CERTIFICATE e END CERTIFICATE).

È possibile rappresentare gli stessi dati usando le rappresentazioni PKCS#7 o PKCS#12, e l'utilità a riga di comando openssl può essere usata per farlo.

Gli ovvi vantaggi del PEM sono che è sicuro da incollare nel corpo di un messaggio di posta elettronica perché ha linee di ancoraggio ed è pulito a 7 bit.

RFC1422 ha maggiori dettagli sullo standard PEM per quanto riguarda le chiavi e i certificati.

Commentari (2)