Dove è specificato il formato file PEM?

Ho bisogno di analizzare i file .PEM.
So che lo standard per “Posta elettronica con protezione della privacy” è definito nelle RFC 1421-24. Ma non sembrano menzionare alcun testo che trovo all’interno dei file OpenSSL .pem (ad esempio “Attributi chiave”, “INIZIO CERTIFICATO”, ecc.). È un formato specifico OpenSSL?

Spesso è utile guardare un’implementazione esistente e vedere cosa fanno. OpenSSL / LibreSSL definisce questi indicatori BEGIN e END in crypto / pem / pem.h. Ad esempio, l’attuale LibreSSL ha il seguente:

#define PEM_STRING_X509_OLD "X509 CERTIFICATE" #define PEM_STRING_X509 "CERTIFICATE" #define PEM_STRING_X509_PAIR "CERTIFICATE PAIR" #define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE" #define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST" #define PEM_STRING_X509_REQ "CERTIFICATE REQUEST" #define PEM_STRING_X509_CRL "X509 CRL" #define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY" #define PEM_STRING_PUBLIC "PUBLIC KEY" #define PEM_STRING_RSA "RSA PRIVATE KEY" #define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY" #define PEM_STRING_DSA "DSA PRIVATE KEY" #define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY" #define PEM_STRING_PKCS7 "PKCS7" #define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA" #define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY" #define PEM_STRING_PKCS8INF "PRIVATE KEY" #define PEM_STRING_DHPARAMS "DH PARAMETERS" #define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS" #define PEM_STRING_DSAPARAMS "DSA PARAMETERS" #define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY" #define PEM_STRING_ECPARAMETERS "EC PARAMETERS" #define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY" #define PEM_STRING_PARAMETERS "PARAMETERS" #define PEM_STRING_CMS "CMS" 

E per quanto ne so, non esiste un elenco principale dei marker BEGIN / END. Sono praticamente definiti in base alle necessità di un’implementazione. E poi se vuoi interagire con questa implementazione, aggiungi la stringa alla tua.

Risposta aggiornata per il 2015 : dato che gli utenti hanno già risposto due volte, prima che il moderatore @royhowie cancellasse le risposte: ora c’è RFC 7468 che definisce le intestazioni PEM . La seguente citazione è solo una piccola parte, e dovresti leggere le specifiche attuali, che probabilmente rimarranno su Internet per molto più tempo di quanto avverrà StackOverflow.

Comunque @royhowie cancella ogni risposta come ‘solo collegamento’ a meno che non abbia del testo. Quindi ecco un testo:

  1. Codifica testuale della syntax della richiesta di certificazione PKCS # 10

    Le richieste di certificazione PKCS # 10 sono codificate utilizzando l’etichetta “RICHIESTA DEL CERTIFICATO”. I dati codificati DEVONO essere un BER (DER fortemente preferito, vedi Appendice B) ASN.1 CertificationRequest struttura come descritto in [RFC2986].

—– INIZIA LA RICHIESTA DEL CERTIFICATO —–

ByqGSM49AgEGBSuBBAAhAzoABLLPSkuXY0l66MbxVJ3Mot5FCFuqQfn6dTs MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm c3NvbiBEYXRha29uc3VsdCBBQjEWMBQGA1UEAxMNam9zZWZzc29uLm9yZzBOMBAG + 9 / CM EOlSwVej77tj56kj9R / j9Q + LfysX8FO9I5p3oGIwYAYJKoZIhvcNAQkOMVMwUTAY BgNVHREEETAPgg1qb3NlZnNzb24ub3JnMAwGA1UdEwEB / wQCMAAwDwYDVR0PAQH / BAUDAwegADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgM / ADA8 AhxBvfhxPFfbBbsE1NoFmCUczOFApEuQVUw3ZP69AhwWXk3dgSUsKnuwL5g / ftAY dEQc8B8jAcnuOrfU

—– RICHIESTA DEL CERTIFICATO DI FINE —–

Figura 9: Esempio di PKCS # 10

Anche l’etichetta “NEW CERTIFICATE REQUEST” è ampiamente utilizzata. I generatori conformi a questo documento DEVONO generare etichette “RICHIESTA DEL CERTIFICATO”. I parser POSSONO trattare la “NUOVA RICHIESTA DI CERTIFICATO” come equivalente a “RICHIESTA DI CERTIFICATO”. ^

Per iniziare: per quanto ne so, se c’è una parte che è leggibile dall’uomo (ha parole e cose), è pensata per gli operatori umani per sapere quale sia la certificazione in questione, le date di scadenza, ecc. Per una rapida verifica manuale . Quindi puoi ignorarlo.

Dovrai analizzare ciò che c’è tra i blocchi BEGIN-END.

All’interno, troverai un’entity framework con codifica Base64 che devi convertire in Base64 in byte. Questi byte rappresentano un certificato / chiave codificata DER / ecc. Non sono sicuro di quali buone librerie potresti usare per analizzare i dati DER.

Come test per capire quali dati si trovano all’interno di ogni blocco, puoi incollare ciò che c’è tra i blocchi BEGIN-END su questo sito che decodifica ASN.1 in JavaScript:

http://lapo.it/asn1js/

Anche se non avrei incollato alcun codice privato dell’ambiente di produzione a nessun sito (anche se sembra essere solo un javascript).

Base64: http://en.wikipedia.org/wiki/Base64

DER: http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules

ASN.1: http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One

Ho trovato una vecchia discussione riguardo a questo problema. Sembra che non ci sia un formato standard “ufficiale” per i limiti di incapsulamento e il modo migliore per determinare ciò è indovinare i contenuti in base a parole chiave ben note che trovi BEGIN .

Come indicato da indiv, per l’elenco completo delle parole chiave, fare riferimento al file di intestazione OpenSSL crypto / pem / pem.h.

Non sono sicuro se è specifico per OpenSSL, ma la documentazione per PEM Encryption Format potrebbe essere ciò che stai cercando.

Dove è specificato il formato file PEM?

Non c’è un posto. Dipende dallo standard. Puoi persino creare i tuoi limiti di incapsulamento e usarli nel tuo software.

Come dichiarato @indiv, OpenSSL ha una lista abbastanza completa in /crypto/pem/pem.h .

Qualcuno ha chiesto al PKIX Working Group di fornire un elenco come quello che si sta chiedendo nel 2006. Il gruppo di lavoro ha rifiutato. Vedere la richiesta di bozza in formato rfc per il file PEM .