Як перетворити відкритий ключ ssh-keygen у формат, який буде використовувати функцію 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, який перетворить вміст відкритого ключа у формат рядка base64 PEM ASCII. Однак функція все ще не подобається.

У документації на Openssl зазначено:

  1. "RSA_PUBKEY () функція, яка обробляє відкритий ключ за допомогою структури EVP_PKEY"
  2. "Функції RSA_PUBKEY також обробляють відкритий ключ RSA за допомогою структури RSA"

Як я можу відкрити свій відкритий ключ OpenSSH у будь-якому форматі, щоб функція OpenSSL споживала його?


Зрозуміло це: використовуйте інструмент openssl лише як такий:
PeteP

Створити приватний ключ: openssl genrsa -out test.priv.key 2048; Вивести відкритий ключ у тому самому форматі (PEM?): Openssl rsa -в test.priv.key -pubout -out test.pub.key
PeteP

Відповіді:


56

ГАРАЗД!

Тож я заглибився в таке мислення "Легко, це я зрозумів". Виявляється, тут є набагато більше, ніж я навіть думав.

Тож перше питання полягає в тому, що (згідно зі сторінками для 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.
кришка

3
Кришка, дивіться примітку у відповіді про версію SSH. OS X не постачає останню версію OpenSSH. Виконайте команду ssh -V.
Брайан Руда борода

3
Не працює в OpenSSH_6.2p2. Чи працює в OpenSSH_6.6p1.
Старий Про

-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

Дякую, -pubout із приватного ключа зробив для мене трюк.
Shaun Dewberry

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 -в ключі -pubout -out key.pub.openssl.pkcs8
Mohannd

6

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

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem

це насправді, здається, не працює.
поза2344

5
Цей ТІЛЬКИ працює для приватного ключа RSA НЕ запитував ОП відкритого ключа. Так неправильна відповідь.
Devy

3
Насправді id_rsaвже в потрібному форматі, ви можете перевірити це самостійно, отримане id_rsa.pemна 100% ідентичне.
Miro Kropacek

-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не є відкритим ключем. Неправильну відповідь.
Ахмет Альп Балкан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.