Chociaż powyższe komentarze dotyczące 32-bajtowych nagłówków, formatów OID i tym podobnych są interesujące, osobiście nie widzę tego samego zachowania, zakładając, że rozumiem. Pomyślałem, że pomocne może być dalsze zbadanie tego, co większość może uważać za nadmierne szczegóły. Nie ma nic lepszego niż nadmiar.
Na początek utworzyłem klucz prywatny RSA i sprawdziłem go:
>openssl rsa -in newclient_privatekey.pem -check
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4pOYWo+GeAEmU4N1HPZj1dxv70
4hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyozC/zSqcuU6iBrvzDTpyG1zhIG
76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknmLBrtZkLkBhchgYnMswIDAQAB
AoGAQaJ5aivspeEXcpahWavzAFLv27+Tz48usUV+stY6arRhqbBEkV19/N5t8EPA
01U6IGDQ8QIXEIW/rtsHKM6DAZhAbakPDJhJRatcMzJ08ryIkP/c3+onkTquiveG
brw7xzn6Xa8ls04aQ6VQR4jxXUjV5bB72pFZnGRoAmS2NiECQQDUoISbmTGjnHM+
kEfunNTXbNmKklwTYhyZaSVsSptnD7CvLWB4qB/g4h2/HjsELag6Z7SlWuYr7tba
H3nBYn35AkEAykFRudMqlBy3XmcGIpjxOD+7huyViPoUpy3ui/Bj3GbqsbEAt9cR
PyOJa1VFa2JqShta1Tdep8LJv1QvgvY7CwJBAML+al5gAXvwEGhB3RXg0fi2JFLG
opZMFbpDCUTkrtu3MeuVC7HbTVDpTSpmSO0uCed2D97NG+USZgsnbnuBHdECQQCw
S3FWPXdetQ0srzaMz61rLzphaDULuZhpBMNqnTYeNmMaUcPjewagd3Rf52rkKFun
juKE+Yd7SXGbYWEskT5zAkAD7tbNwe5ryD2CT71jrY/5uXMR2yg/A4Ry2ocZkQUp
iGflLrHnODvHO5LYLBlSKpjanBceYHJLuMFNZruf7uBM
-----END RSA PRIVATE KEY-----
(Och, okropności! Ujawniłem klucz prywatny. Meh ...)
Wyodrębniam i wyświetlam jego klucz publiczny:
>openssl rsa -in newclient_privatekey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
Tak się składa, że istnieje inny parametr wyjściowy klucza publicznego (jak wspomniano we wcześniejszym komentarzu). Wyodrębniam i wyświetlam klucz publiczny za pomocą tego słowa kluczowego:
>openssl rsa -in newclient_privatekey.pem -RSAPublicKey_out
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----
Dobrze, dobrze. Te dwie wartości klucza publicznego nie są takie same, chociaż pochodzą z tego samego klucza prywatnego. A może są takie same? Wycinam i wklejam dwa ciągi kluczy publicznych do ich własnych plików, a następnie sprawdzam każdy z nich:
>openssl rsa -in newclient_publickey.pem -pubin -modulus
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
The „pubin” mówi RSA, że to naprawdę jest ma być klucz publiczny i nie skarżą się, że nie jest to klucz prywatny.
Teraz bierzemy publiczny klucz RSA, wyświetlamy moduł i przekształcamy go w zwykły stary „klucz publiczny” (znowu musimy powiedzieć, że dane wejściowe są kluczem publicznym):
>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
Ten sam moduł i ta sama wartość „klucza publicznego”. Aby uczynić rzeczy bardziej interesującymi (w każdym razie dla mnie), kiedy dodamy słowo kluczowe RSAPublicKey_out , otrzymujemy:
>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -modulus -RSAPublicKey_out
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----
... i kiedy transmogryfikujemy zwykły stary „klucz publiczny” w klucz publiczny RSA:
>openssl rsa -in newclient_publickey.pem -pubin -RSAPublicKey_out
writing RSA key
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKf86UWTu8tFDp0GI1CS+OeGbik5haj4Z4ASZTg3Uc9mPV3G/vTiGbzR
5hzuHXbFzuhVwMsF0cHIYAYGlB+mOB0/KjML/NKpy5TqIGu/MNOnIbXOEgbvoqty
N1tfo+UoA872v90JGZSKMWFWhSVjrLAaSeYsGu1mQuQGFyGBicyzAgMBAAE=
-----END RSA PUBLIC KEY-----
... maszerujesz nieubłaganie i chociaż zrobiliśmy to kilka poleceń temu, aby podkreślić, że odwrócimy rzeczy, aby transmogryfikacja przebiegała z RSA do zwykłego starego „klucza publicznego”:
>openssl rsa -in newclient_rsapublickey.pem -RSAPublicKey_in -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
... co prowadzi nas z powrotem do miejsca, w którym zaczęliśmy. Czego się nauczyliśmy?
Podsumowanie: klucze wewnętrznie są takie same, po prostu wyglądają inaczej. Wcześniejszy komentarz wskazywał, że format klucza RSA został zdefiniowany w PKCS # 1, a zwykły stary format „klucza publicznego” został zdefiniowany w PKCS # 8. Jednak edycja jednego formularza nie zmienia go w drugi. Mam nadzieję, że pokonałem to wyróżnienie na śmierć.
Jednak na wypadek, gdyby pozostała jeszcze iskierka życia, zacznijmy trochę więcej i odwołajmy się do certyfikatu, który został pierwotnie wygenerowany z kluczem prywatnym RSA tak dawno temu, badając jego klucz publiczny i moduł:
>openssl x509 -in newclient_cert.pem -pubkey -noout -modulus
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
Modulus=
A7FCE94593BBCB450E9D06235092F8E7
866E293985A8F867801265383751CF66
3D5DC6FEF4E219BCD1E61CEE1D76C5CE
E855C0CB05D1C1C8600606941FA6381D
3F2A330BFCD2A9CB94EA206BBF30D3A7
21B5CE1206EFA2AB72375B5FA3E52803
CEF6BFDD0919948A316156852563ACB0
1A49E62C1AED6642E40617218189CCB3
... i wszyscy żyli długo i szczęśliwie: certyfikat ma taką samą wartość modułu, jak klucz publiczny RSA, klucz prywatny RSA i zwykły stary „klucz publiczny”. Certyfikat zawiera tę samą zwykłą wartość „klucza publicznego”, którą widzieliśmy wcześniej, chociaż został podpisany plikiem oznaczonym jako klucz prywatny RSA. Można śmiało powiedzieć, że istnieje konsensus.
W kwadrancie X509 galaktyki OpenSSL nie ma odpowiednika słowa kluczowego „RSAPublicKey_out”, więc nie możemy tego wypróbować, chociaż wartość modułu jest opisana jako „kluczowy moduł RSA”, który, jak przypuszczam, jest tak blisko, jak to tylko możliwe.
Jak to wszystko wyglądałoby z certyfikatem podpisanym przez DSA, nie wiem.
Zdaję sobie sprawę, że to nie odpowiada na pierwotne pytanie, ale być może dostarcza przydatnych informacji. Jeśli nie, przepraszam. Przynajmniej rzeczy, których nie należy robić i założenia, których nie należy robić.
Bez wątpienia można zauważyć nieco irytujące powtarzanie się „pisania klucza RSA”, kiedy nie robi się czegoś takiego. Zakładam, że chodziło o to, że moduł rsa rozpoznaje zwykły stary klucz publiczny jako prawdziwy klucz RSA, i dlatego ciągle używa „klucza RSA” (a ponadto jest to w końcu moduł rsa). Jeśli dobrze pamiętam, ogólna struktura EVP_PKEY ma unię dla wszystkich typów kluczy, przy czym każdy typ klucza ma swój własny specjalny zestaw wartości (pomocna nazwa g, w, q i inne spółgłoski).
Podsumowując, zauważam, że była skarga dotycząca programowania i rozwoju; teraz każde polecenie OpenSSL ma oczywiście odpowiadający mu kod, a jeśli ktoś chciałby zbadać wszystkie cuda, którymi jest dziś programowanie OpenSSL, wiersz poleceń wydaje się rozsądnym miejscem do rozpoczęcia. W tym konkretnym przypadku (ponieważ w tej chwili używam najnowszego cygwina) można zacząć od przejrzenia \ openssl-1.0.2f \ apps \ rsa.c i (biorąc pod uwagę, że ma on dużą tolerancję na makra) \ openssl-1.0. 2f \ crypto \ pem \ pem_all.c