Хоча наведені вище коментарі щодо 32-байтових заголовків, форматів OID та подібних цікаві, я особисто не бачу такої ж поведінки, припускаючи, що я зрозумів суть. Я вважав, що може бути корисним вивчити це далі, на думку більшості надмірних деталей. Ніщо не перевищує, як надлишок.
Для початку я створив приватний ключ RSA і перевірив його:
>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-----
(О, жахи! Я викрив приватний ключ. Ме ...)
Я витягаю та відображаю його відкритий ключ:
>openssl rsa -in newclient_privatekey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCn/OlFk7vLRQ6dBiNQkvjnhm4p
OYWo+GeAEmU4N1HPZj1dxv704hm80eYc7h12xc7oVcDLBdHByGAGBpQfpjgdPyoz
C/zSqcuU6iBrvzDTpyG1zhIG76KrcjdbX6PlKAPO9r/dCRmUijFhVoUlY6ywGknm
LBrtZkLkBhchgYnMswIDAQAB
-----END PUBLIC KEY-----
Так трапляється, є інший вихідний параметр відкритого ключа (як уже згадувалося в попередньому коментарі). Я витягаю та відображаю відкритий ключ, використовуючи це ключове слово:
>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-----
Добре. Ці два значення відкритого ключа не є однаковими, хоча походять від одного і того ж приватного ключа. Або вони однакові? Я вирізаю та вставляю два рядки відкритих ключів у власні файли, а потім перевіряю модуль на кожному:
>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-----
«Pubin» говорить ПДС , що це на самому справі це повинен бути відкритий ключ, і не скаржаться , що це не закритий ключ.
Тепер ми беремо відкритий ключ RSA, відображаємо модуль і перетворюємо його на звичайний старий "відкритий ключ" (знову ж таки, ми повинні сказати йому, що вхід є відкритим ключем):
>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-----
Відображається той самий модуль і одне і те ж значення „відкритого ключа”. Щоб зробити речі цікавішими (у будь-якому випадку для мене), коли ми беремо ключове слово RSAPublicKey_out, отримуємо:
>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-----
... і коли ми перетворюємо звичайний старий «відкритий ключ» на відкритий ключ 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-----
.
>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-----
... що повертає нас туди, звідки ми почали. Що ми дізналися?
Короткий зміст: клавіші всередині однакові, вони просто виглядають по-різному. У попередньому коментарі зазначалося, що формат ключа RSA був визначений у PKCS # 1, а звичайний старий формат "відкритого ключа" був визначений у PKCS # 8. Однак редагування однієї форми не перетворює її на іншу. Сподіваюся, я зараз перебив цю відзнаку до смерті.
Якщо все-таки залишилася іскра життя, давайте ще трохи бичувати і посилатися на сертифікат, який спочатку був створений із закритим ключем RSA так давно, вивчивши його відкритий ключ і модуль:
>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
... і всі вони жили довго і щасливо: сертифікат має таке саме значення модуля, як відкритий ключ RSA, приватний ключ RSA та звичайний старий «відкритий ключ». Сертифікат містить те саме звичайне старе значення «відкритого ключа», що ми бачили раніше, хоча воно було підписане файлом, позначеним як закритий ключ RSA. Можна з упевненістю сказати, що є консенсус.
У квадранті X509 галактики OpenSSL немає еквівалентного ключового слова 'RSAPublicKey_out', тому ми не можемо спробувати це, хоча значення модуля описується як "модуль ключа RSA", який, на мою думку, наближається до нас.
Як би все це виглядало із сертифікатом, підписаним DSA, я не знаю.
Я усвідомлюю, що це не дає відповіді на вихідне питання, але, можливо, воно дає деяку корисну довідку. Якщо ні, мої вибачення. Принаймні, речей, яких не можна робити, а припущень - не робити.
Без сумніву, хтось зауважив трохи дратує повторення "написання ключа RSA", коли він не робить нічого подібного. Я припускаю, що мається на увазі те, що модуль rsa розпізнає звичайний старий відкритий ключ як справжній ключ RSA, і саме тому він продовжує покладатися на "ключ RSA" (плюс, зрештою, це модуль rsa). Якщо я правильно згадую, загальна структура EVP_PKEY має об’єднання для всіх типів ключів, причому кожен тип ключів має свій спеціальний набір значень (корисно названі g, w, q та інші приголосні).
На закінчення зазначу, що була скарга щодо програмування та розробки; Зараз кожна команда OpenSSL, очевидно, має відповідний код, і якщо хочеться дослідити всі чудеса, які сьогодні є програмуванням OpenSSL, командний рядок здається розумним місцем для початку. У цьому конкретному випадку (оскільки я зараз використовую нещодавній cygwin) можна почати з перегляду \ openssl-1.0.2f \ apps \ rsa.c та (з урахуванням того, що один з них має високий допуск до макросів) \ openssl-1.0. 2f \ crypto \ pem \ pem_all.c