Хотя приведенные выше комментарии относительно 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-----
... неумолимо идем вперед, и хотя мы сделали это всего несколько команд назад, чтобы придать смысл, мы перевернули все так, чтобы трансмогрификация происходила от RSA к обычному старому «общедоступному ключу»:
>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 \ крипто \ pem \ pem_all.c