Strumenti per sviluppatori · Codificatore e decodificatore Base64
PEM spiegato: perché i certificati e le chiavi sono Base64 tra BEGIN e END
· Sfondo
base64 codifica
Un file PEM è DER binario racchiuso in Base64 con linee di armatura etichettate. Questo post spiega le origini del formato, le sue regole di linea e cosa puoi e cosa non puoi imparare decodificandone uno.
Il certificato che "sembra testo" ma non riesce ad analizzare: un errore di battitura nell'intestazione, un ritorno a capo vagante e il formato sottostante
Un file PEM è un file binario con codifica Base64 racchiuso in etichette di testo. Il nome deriva da Privacy-Enhanced Mail (RFC 1421, 1992), che utilizzava questo formato per i messaggi crittografati. Il formato sopravvive oggi nei certificati TLS, nelle chiavi SSH e nelle chiavi GPG. La struttura è semplice: una riga che dice -----BEGIN CERTIFICATE----- (o BEGIN PRIVATE KEY, BEGIN PUBLIC KEY, ecc.), seguita da 64 righe di caratteri di testo base64, seguite da -----END CERTIFICATE-----.
Il corpo base64 viene decodificato in un formato binario chiamato DER (Distinguished Encoding Rules), che è un modo per serializzare i dati strutturati (in particolare, le strutture ASN.1). Decodificare base64 ti dà binario; leggere il binario richiede la comprensione di ASN.1, che è complesso. L'armatura PEM esiste perché i file binari sono difficili da inviare via email e modificare. Un file di certificato in formato binario puro si corromperebbe se passato attraverso vecchi sistemi di posta, USENET o moduli web.
L'armatura del testo visibile in un blocco PEM: etichette attorno a un corpo Base64
Codificando il codice binario in base64 e racchiudendolo in etichette di testo, l'intero certificato diventa testo 7-bit ASCII che sopravvive a qualsiasi trasporto. Un editor di testo può aprirlo; un sistema di posta non lo corromperà. Le righe -----BEGIN e -----END sono etichette per esseri umani e strumenti automatizzati; indicano chiaramente il tipo di dati contenuti all'interno. Un certificato è etichettato CERTIFICATE; una chiave privata è etichettata PRIVATE KEY.
L'etichetta non è verificata dal software crittografico; è solo un suggerimento per gli esseri umani e gli strumenti. Il limite di riga di caratteri 64 in PEM deriva da RFC 1421 e lo stesso ragionamento MIME dell'e-mail base64: i vecchi sistemi di posta avevano limiti di lunghezza di riga e i caratteri 64 si adattavano a un terminale degli anni '80. PEM racchiude l'output base64 in caratteri 64 con un finale di riga (CR LF su Windows, LF su Unix).
Dal testo etichettato ai byte decodificati: questo repository non stabilisce la cronologia del formato
Quando decodifica un certificato PEM, il parser deve rimuovere le linee dell'armatura (-----BEGIN..., -----END...) e la linea si interrompe, quindi decodificare base64 il resto. Un ritorno a capo errato o un'etichetta non corrispondente possono interrompere l'analisi. Il ritorno a capo della riga non fa parte dello standard base64 (RFC 4648 base64 viene scartato); è specifico per PEM. All'interno di base64 è presente il binario con codifica DER. DER è ASN.1 (Abstract Syntax Notation), una specifica complessa per rappresentare strutture di dati.
Un certificato è un record strutturato contenente un nome del soggetto, una chiave pubblica, una firma e metadati. ASN.1 non descrive direttamente i byte; descrive come la struttura dovrebbe essere codificata.
Anatomia del blocco come input per questo strumento: rimuovi le etichette e passa solo il corpo Base64
La codifica inizia con triplette tag-lunghezza-valore. Ad esempio, un SEQUENCE in ASN.1 è codificato come tag 0x30, seguito dalla lunghezza dei contenuti, seguita dai contenuti stessi. Un certificato inizia sempre con i byte 0x30 0x82 (sequenza, lunghezza codificata in due byte), che appare come MII in base64.
Controllare un certificato senza analizzarlo: i primi tre caratteri del corpo di un certificato PEM sono quasi sempre MII (che è 0x30 0x82 in base64, l'inizio di un SEQUENCE). Se un blocco PEM non viene decodificato in 0x30, il base64 è danneggiato o l'etichetta è errata. Lo strumento di codifica e decodifica Base64 può decodificare il corpo e mostrarti l'esadecimale: incolla le linee Base64 (senza l'armatura -----BEGIN e END), rimuovi le interruzioni di riga e decodifica.
Cosa espone la decodifica: byte binari, campi del certificato non analizzati
Se l'output è binario e inizia con 30 82, è probabile che si tratti di una struttura di certificato valida. Se è incomprensibile o contiene testo, la decodifica non è riuscita o il base64 è sbagliato. Errori comuni PEM: una mancata corrispondenza dell'etichetta (ad esempio, un ente di certificato con un'etichetta PRIVATE KEY), un problema di fine riga di Windows (alcuni parser si bloccano su CRLF), un errore di battitura nella riga dell'armatura (spazi o caratteri extra) o interruzioni di riga mancanti.
Gli strumenti prevedono -----BEGIN CERTIFICATE----- non -----BEGIN CERT----- o BEGIN CERTIFICATE. Copiare e incollare un PEM da un browser Web o un PDF può introdurre virgolette Unicode o virgolette inglesi invece delle virgolette ASCII, rompendo l'etichetta. Incollare una chiave privata nel campo di un certificato è un errore comune; il parser lo rifiuterà perché l'etichetta non corrisponde. PEM supporta più blocchi in un unico file.
Esempio realizzato: decodificare un corpo breve e ispezionare i byte senza affermare una firma di certificato
Un file di chiavi SSH potrebbe contenere sia una chiave privata (etichettata PRIVATE KEY) sia una chiave pubblica (etichettata PUBLIC KEY) o più blocchi di certificati. Un parser legge il file dall'alto, cercando le righe che iniziano con -----BEGIN. Quando ne trova uno, legge finché -----END con l'etichetta corrispondente, estrae e decodifica base64 il corpo e lo elabora. Quindi continua a cercare il blocco successivo.
Una catena di certificati concatenata accidentalmente (più blocchi PEM per un certificato e i suoi elementi intermedi) in un file è valida se tutte le etichette sono corrette. Il formato PEM è stato standardizzato per la posta con privacy avanzata (RFC 1421) all'inizio degli anni '90.
Cosa non copre: analisi delle strutture ASN.1, crittografia a chiave privata e bundle PKCS#12
RFC 7468 (2015) ha modernizzato la definizione, chiarendo le regole sulla lunghezza della linea, il formato della linea dell'armatura e i casi limite. La maggior parte degli strumenti e degli standard fanno riferimento a RFC 7468 ora. Esistono altri formati da binario a testo (come DER-to-hex per alcuni protocolli), ma PEM con etichette base64 e ASCII è lo standard de facto per la crittografia e TLS perché è leggibile dall'uomo, testo semplice e facile da copiare o inviare.
Creazione di un blocco PEM: prendi il file binario DER (ad esempio, un certificato da una libreria crittografica), codificalo in base64, avvolgi il risultato in caratteri 64 con interruzioni di riga e racchiudilo con -----BEGIN CERTIFICATE----- e -----END CERTIFICATE----- righe. Analisi di un blocco PEM: trova le righe -----BEGIN e -----END, estrai il corpo base64 (rimuovendo l'armatura e le interruzioni di riga), decodifica base64 per ottenere il binario, quindi analizza DER e ASN.1 binario.
Conclusione: PEM è Base64 con etichette: come il codificatore e decodificatore Base64 ti offre un posto locale per provare il corpo Base64 di un blocco, interamente nel browser
La maggior parte degli strumenti lo automatizza; raramente costruisci PEM a mano. Ma comprendere la struttura è utile durante il debug di un errore di analisi o durante la verifica manuale di un certificato. Un certificato PEM sembra testo, ma il contenuto è costituito da dati binari. Leggere le etichette di inizio e fine non ti dice cosa contiene il certificato; è necessario decodificare base64 e analizzare ASN.1 per vedere il nome del soggetto, la chiave pubblica, l'emittente e la scadenza.
Lo strumento di codifica e decodifica Base64 può decodificare il corpo in modo da poter ispezionare i primi byte. Per l'analisi completa, è necessario un parser ASN.1 (la maggior parte dei linguaggi di programmazione dispone di librerie per questo). L'aspetto fondamentale è che PEM è un formato contenitore: contiene tutti i dati codificati con DER, non solo i certificati. L'etichetta indica l'uso previsto, ma il parser deve gestire correttamente il tipo di dati.