Как преобразовать открытый ключ ssh-keygen в формат, который будет использовать функция openssl PEM_read_bio_RSA_PUBKEY ()?

49

У меня проблема с генерацией открытого ключа, который PEM_read_bio_RSA_PUBKEY()может использовать функция openssl . Я продолжаю получать ошибки.

Очевидно, что я не могу просто использовать строку ASCII в ssh-keygen <>.pubфайле ключей, так как она находится в формате файла SSH, или я, возможно, SubjectPublicKeyInfoструктурирую.

Вот ключевой ген код: ssh-keygen -t rsa -b 1024 -C "Test Key"

В интернете я нашел конвертер в php, который преобразует содержимое открытого ключа в формат строки PEM ASCII base64. Однако функция по-прежнему не нравится.

Документация Openssl гласит:

  1. «Функция RSA_PUBKEY (), которая обрабатывает открытый ключ, используя структуру EVP_PKEY»
  2. «Функции RSA_PUBKEY также обрабатывают открытый ключ RSA с использованием структуры RSA»

Как получить открытый ключ OpenSSH в любом формате, который будет использовать функция OpenSSL?

PeteP
источник
Понял это: используйте инструмент openssl только как таковой:
PeteP
Создать закрытый ключ: openssl genrsa -out test.priv.key 2048; Вывод открытого ключа в том же формате (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP
Перекрестный связанный security.stackexchange.com/questions/32768/…
dave_thompson_085

Ответы:

57

ХОРОШО!

Так что я вошел в это мышление "Легко, я получил это". Оказывается, это намного больше, чем я думал.

Итак, первая проблема заключается в том, что (согласно страницам руководства для OpenSSL (man 3 pem)), OpenSSL ожидает, что ключ RSA будет в формате PKCS # 1. Очевидно, это не то, с чем работает ssh-keygen. У вас есть два варианта (от поиска вокруг).

Если у вас OpenSSH v. 5.6 или более поздней версии (у меня не было на моем ноутбуке), вы можете запустить это:

ssh-keygen -f key.pub -e -m pem

Более длинный способ сделать это состоит в том, чтобы разбить ваш ключ SSH на его различные компоненты ( запись в блоге, в которой я нашел кое-что из этого, обвиняет OpenSSH в «проприетарности», я предпочитаю называть его «уникальным»), а затем использовать библиотеку ASN1. обменять вещи вокруг.

К счастью для вас, кто-то написал код для этого:

https://gist.github.com/1024558

Брайан Редберд
источник
9
ssh-keygenПохоже, что этот метод работает в Linux, но не в Mac OS X.
lid
3
Крышка, см. Примечание в ответе о версии SSH. OS X не поставляется с последней версией OpenSSH. Запустите команду ssh -V.
Брайан Редберд
3
Не работает в OpenSSH_6.2p2. Работает в OpenSSH_6.6p1.
Old Pro
-mне работает для меня ... что обходится?
pstanton
2
У меня работает на Mac!
Грег Хорнби
18

Предполагая, что у вас есть закрытый ключ SSH id_rsa, вы можете извлечь из него открытый ключ следующим образом:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

Я понимаю, что ОП спросил о преобразовании открытого ключа, так что это не совсем отвечает на вопрос, однако я подумал, что это будет полезно для некоторых в любом случае.

Также обратите внимание, что эта команда приводит к формату открытого ключа PEM, который, как правило, ожидает OpenSSL. Ответ Брайана, с другой стороны, приводит к файлу в формате RSAPublicKey, который не является нормальным форматом, ожидаемым OpenSSL (хотя более поздние версии, очевидно, могут читать его через -RSAPublicKey_inфлаг). Для конвертации вы можете сделать это:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
shawkinaw
источник
Спасибо, -pubout из закрытого ключа помог мне.
Шон Дьюберри
openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemтакже работает (то есть ввод является закрытым ключом формата pem). Хороший ответ.
Джонни Вонг
1
Обновление: ответ Брайана был исправлен, и, -m pkcs8несмотря на то, что ребята из OpenSSH, использующие неправильное имя, действительно выдают X.509 'PUBKEY'. Кроме того, начиная с OpenSSH 6.5 в 2014-01 годах, если создатель указал «новый формат» -oдля большей безопасности, этот метод не будет работать, и с 7.8 в 2018-08 «новый формат» теперь используется по умолчанию, то же самое.
dave_thompson_085
11

Формат, который вы хотите, это то, что ssh-keygenзвонит PKCS8. Поэтому следующая команда выдаст желаемый результат:

ssh-keygen -f key.pub -e -m pkcs8

Со ssh-keygenстраницы руководства :

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.
Аарон Меривезер
источник
Этот на самом деле работает как на Linux, так и на MacOS.
Джей Тейлор
извлечь эквивалентный сгенерированный открытый ключ из закрытого ключа в OpenSSL. openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd,
6

Подобно методу Амаль Чаудхури ниже, это то, что мне помогло. Мне нужно было создать файл pem из открытого ключа ssh, который я сгенерировал для своего SFTP-клиента (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
l3e0wu1f
источник
это на самом деле не похоже на работу.
outside2344
5
Это работает ТОЛЬКО для закрытого ключа RSA, а НЕ для запроса открытого ключа OP. Так что неправильный ответ.
Деви
3
На самом деле, id_rsaуже в правильном формате, вы можете проверить это самостоятельно, результат id_rsa.pemна 100% идентичен.
Миро Кропачек
-2

Еще один способ сделать это с другого сайта. Отправьте это на тот случай, если вам нужен другой метод. Работает очень хорошо. http://www.chatur.com.np/2011/01/convert-openssh-rsa-key-to-pem-format.html

openssl dsa -in ~/.ssh/id_dsa -outform pem > id_dsa.pem
Амаль Чаудхури
источник
Этот метод, похоже, на самом деле не работает.
Шон
7
id_rsaне является открытым ключом. Неверный ответ.
Ахмет Алп Балкан