(aggiornato con alcune informazioni di base)
Per le operazioni RSA, la chiave pubblica consiste in un modulo il prodotto di due numeri primi grandi, p e q , che devono essere tenuto segreto, e un esponente , che è tipicamente 65537. Non sempre, ma la rappresentazione binaria di quest'ultimo (solo due in 17 bit) consente operazioni più efficienti, quindi è molto comune.
Poiché la chiave consiste di due numeri, sono disponibili varie tecniche per accertarsi che entrambe siano disponibili per l'elaborazione.
La domanda iniziale era cosa significasse questo due diversi formati. Se si guarda attentamente, il modulo sopra riportato fa parte della stringa esadecimale "Chiave pubblica", a partire dal byte numero 8. Inoltre, il finale in binario è 010001, che è 65537 in decimale, quindi sembra che "Chiave pubblica" sia infatti contiene entrambi i valori con qualche frammento binario.
Con i certificati X.509, la maggior parte dei dati è codificata con rappresentazioni ASN.1. La rappresentazione ASN.1 è uno standard di rappresentazione molto versatile (e complesso), più comunemente codificato in due diversi formati: DER o PEM. PEM è molto facile da riconoscere in quanto utilizza un PGP come il frame BEGIN / END e DER è il raw, binario. PEM è in realtà il DER codificato Base64, con le linee BEGIN / END attorno ad esso.
Per manipolare questi dati, i tre sottocomandi openssl più utili sono "openssl x509", "openssl asn1parse" e "openssl rsa" (descritti rispettivamente in x509 (1), asn1parse (1) e rsa (1 ) pagine del manuale).
Poiché la codifica esadecimale di cui sopra non sembra rappresentare il testo, quindi sembra meglio guardarlo con lo strumento asn1parse (1), dopo la conversione in binario. Ho fatto la conversione a mano, per essere utilizzata dallo strumento xxd (1), solitamente fornito con il pacchetto vim (1); il comando "xxd -r" è usato per invertire la visualizzazione esadecimale dello stesso comando. Ancora una volta, dato che questo esempio è piuttosto breve, ho semplicemente aggiunto le linee di prefisso e ho rotto le linee al limite di 16 byte:
% cat pub.txt
00000000: 3081 8902 8181 00CC CB64 54C2 FAA3 7A81
00000010: 365F 1BD5 1081 75B7 4202 3183 B1D5 5A76
00000020: 726A 77BE 6269 16AB EB39 66B5 2039 33D1
00000030: B401 7D23 4024 9E60 1CA8 3283 EA9D F1F2
00000040: D9F0 1885 9DE1 C0E2 99FF 89A4 F915 BD5D
00000050: BA3F 392E 2614 4880 75EF B5C0 946E 2A62
00000060: D242 342C 4A15 1758 B055 9811 6E91 FD28
00000070: 0D80 C521 C23E FB78 6F38 314A 78F2 812D
00000080: 85C9 B82B F186 C902 0301 0001
Ora è il momento di convertire in binario e controllare se è davvero una codifica ASN.1:
% xxd -r <pub.txt >pub.bin
% openssl asn1parse -inform der <pub.bin
0:d=0 hl=3 l= 137 cons: SEQUENCE
3:d=1 hl=3 l= 129 prim: INTEGER :CCCB6454C2FAA37A81365F1BD5108175B742023183B1D55A76726A77BE626916ABEB3966B5203933D1B4017D2340249E601CA83283EA9DF1F2D9F018859DE1C0E299FF89A4F915BD5DBA3F392E2614488075EFB5C0946E2A62D242342C4A151758B05598116E91FD280D80C521C23EFB786F38314A78F2812D85C9B82BF186C9
135:d=1 hl=2 l= 3 prim: INTEGER :010001
In effetti è - e possiamo vedere i due numeri interi descritti sopra. Ad esempio, possiamo convertirlo in PEM, che potrebbe sembrare più familiare. Sappiamo che è una chiave RSA, quindi possiamo controllare lo strumento rsa (1), e dopo esserci assicurati di specificare il formato DER e una (!) Delle varianti di chiave pubblica RSA, esso effettivamente analizza il binario con successo:
% openssl rsa -RSAPublicKey_in -inform der <pub.bin
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMy2RUwvqjeoE2XxvVEIF1t0IC
MYOx1Vp2cmp3vmJpFqvrOWa1IDkz0bQBfSNAJJ5gHKgyg+qd8fLZ8BiFneHA4pn/
iaT5Fb1duj85LiYUSIB177XAlG4qYtJCNCxKFRdYsFWYEW6R/SgNgMUhwj77eG84
MUp48oEthcm4K/GGyQIDAQAB
-----END PUBLIC KEY-----
(In realtà esiste un altro formato, che verrebbe visualizzato come BEGIN RSA PUBLIC KEY, ma il precedente è solitamente il modo in cui la chiave è rappresentata all'interno del certificato.)
Tutto questo è solo un esercizio per vedere quali sono effettivamente i dati forniti nella domanda. La chiave pubblica RSA raw è solo teoricamente utile, poiché viene gestita durante l'handshake SSL / TLS e richiede anche la maggior parte dei dati del certificato. In teoria, puoi provare a seguire / eseguire il debug dell'handshake, ma in genere è più complicato - con PFS, non è nemmeno possibile, anche se hai le chiavi pubbliche e private. PFS - Perfect Forward Secrecy significa che c'è una chiave effimera casuale concordata durante la stretta di mano che solo i due endpoint conoscono - nemmeno noi osservando l'handshake.
L'unico scopo utile che ho visto che necessita effettivamente di guardare la chiave pubblica è di confrontare il modulo della chiave pubblica con il modulo calcolato dalla chiave privata. Questo è necessario se vuoi verificare quale, o se la chiave privata è corrispondente alla chiave pubblica nel certificato.
I comandi per fare questo sono in qualche modo diversi, dato che di solito hai la chiave come parte di un certificato (nella codifica PEM), e la chiave privata nel formato RSA nella codifica PEM pure:
% openssl x509 -noout -modulus -in myserver.crt
% openssl rsa -noout -modulus -in myserver.key
I due numeri devono corrispondere se si desidera utilizzarli insieme (a volte basta calcolare l'md5 per gli output di cui sopra, il che rende più facile il confronto).