I moduli comuni sono PKCS # 12 / PFX (una coppia di chiavi crittografate, possibilmente con certificati aggiuntivi) e PEM o DER modulo PKCS # 1 utilizzato da OpenSSL e OpenSSH (questo è quanto id_rsa
sarà). PEM è una versione base64 del modulo DER binario (ASN.1) con l'identificazione di intestazione / piè di pagina, non è altrimenti una forma distinta, eccetto per il fatto che consente la crittografia dove non lo è il DER di PKCS # 1.
Se la chiave è crittografata (solo modulo PEM) conterrà linee di intestazione aggiuntive per indicare la crittografia e IV, ad esempio:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AA171F6005B3DD31
...
PKCS # 1 è solo RSA, PKCS # 8 è un "contenitore" più generico per le chiavi, anch'esso è ASN.1 ma indica esplicitamente il tipo di dati all'interno, ad es (vedi offset 9, riga 4):
$ openssl pkcs8 -inform PEM -in ~/.ssh/id_rsa -topk8 -nocrypt \
-outform DER -out id_rsa.p8
$ dumpasn1 -tilda id_rsa.p8
0 1213: SEQUENCE {
4 1: . INTEGER 0
7 13: . SEQUENCE {
9 9: . . OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
: . . . (PKCS #1)
20 0: . . NULL
: . . }
22 1191: . OCTET STRING, encapsulates {
26 1187: . . SEQUENCE {
30 1: . . . INTEGER 0
33 257: . . . INTEGER
: . . . . 00 B1 1F 09 61 C1 A1 09 ....a...
...
(Sto usando dumpasn1
qui invece di openssl asn1parse
, in modo imbarazzante, quest'ultimo non riesce a analizzare correttamente l'output pkcs8
.)
OpenSSH non (AFAIK) supporta PKCS # 8 tranne che per import / export, hanno il loro prodotto di caricamento . Questo formato viene utilizzato solo per i nuovi tipi di chiave (Ed25519), ma in futuro è pianificato come predefinito.
Ci sono alcune cose che puoi controllare utilmente:
- identificazione della riga di intestazione / piè di pagina in PEM e validità della codifica base64
- formato ASN.1 valido (principalmente limitato ai controlli di tipo e lunghezza)
- integrità numerica dei parametri RSA
Potresti anche riflettere su valore dell'esponente pubblico (troppo grande può causare problemi di interoperabilità, troppo piccolo è implicato con problemi di sicurezza per alcune applicazioni).
Il comando openssl rsa ... -check
controlla 1 (solo PEM) e 2 implicitamente, e 3 esplicitamente. Per i dettagli dei controlli, consulta la documentazione di OpenSSL API RSA_check_key()
. Questo dovrebbe essere un controllo sufficiente per la maggior parte, penso.
Un file di chiavi private RSA (quasi sempre) contiene oltre all'esponente della chiave privata, contiene anche i parametri della chiave pubblica e alcuni valori intermedi per l'ottimizzazione (tramite CRT ), questi valori possono essere verificati per coerenza o primato. La "dimensione della chiave" è la lunghezza del "modulo", con l'avvertenza che ci sarà (di solito) un che porta 00 byte per garantire che sia interpretato come un numero intero positivo (problema di notifica ASN.1).
Per una vista diversa puoi anche fare:
openssl asn1parse -inform PEM -in ~/.ssh/id_rsa
(ma questo non controlla i parametri RSA)