key_load_public: недійсний формат


98

Я використав генератор ключів PuTTY для генерації 4096-бітового ключа RSA-2 за допомогою парольної фрази.

Я зберігаю .ppk та відкритий ключ у форматі openSSL. Відкритий ключ формату шпаклівки не працює.

У будь-якому випадку моя помилка така:

$ ssh -T git@github.com
key_load_public: invalid format
Enter passphrase for key '/c/Users/Dan/.ssh/id_rsa':
Hi Dan! You've successfully authenticated, but GitHub does not provide shell access.

У чому проблема?

Я використовую Pageant для завантаження ключів, а я використовую Git Bash, щоб спробувати з'єднання ssh. Я також завантажив ключ у GitHub, не впевнений, що я роблю неправильно.

Я спробував додати новий рядок і не додати новий рядок у GitHub


Чому, на вашу думку, це не працює? У ньому йдеться про успішну автентифікацію .
Роланд Сміт,

2
@RolandSmith Це мені key_load_public: invalid formatправильно каже, коли я виконую команду перед тим, як ввести парольну фразу?
JordanGS

1
Виконайте: 'ssh -vvv -T git@github.com', щоб отримати більше інформації, можливо ~ / .ssh / known_hosts погано - ssh шукає відкритий ключ github. Ви можете запустити "ключ файлу", щоб дізнатися формат файлу ключа.
мош

Відповіді:


182

Як зазначив Роланд у своїй відповіді, це попередження, що ssh-agentне розуміє формат відкритого ключа, і навіть тоді відкритий ключ не буде використовуватися локально.

Однак я можу також пояснити і відповісти, чому є попередження. Це зводиться до того, що генератор ключів PuTTY генерує два різні формати відкритих ключів залежно від того, що ви робите в програмі.

Примітка: Протягом мого пояснення ключові файли, які я буду використовувати / генерувати, будуть називатися id_rsaз відповідними розширеннями. Крім того, для зручності копіювання-вставлення вважається батьківською папкою ключів ~/.ssh/. Налаштуйте ці деталі відповідно до ваших потреб.

Формати

Посилання на відповідну документацію PuTTY

SSH-2

Коли ви зберігаєте ключ за допомогою генератора ключів PuTTY за допомогою кнопки "Зберегти відкритий ключ", він буде збережений у форматі, визначеному RFC 4716 .

Приклад:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "github-example-key"
AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYF
i2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcp
pY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3
oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEA
ip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9
tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw==
---- END SSH2 PUBLIC KEY ----

OpenSSH

Всупереч поширеній думці, цей формат генератор не зберігає. Однак він генерується та відображається у текстовому полі під назвою "Відкритий ключ для вставки у файл санкціонованих ключів OpenSSH". Щоб зберегти його як файл, вам потрібно скопіювати його вручну з текстового поля та вставити у новий текстовий файл.

Для ключа, показаного вище, це буде:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key

Формат ключа є простим ssh-rsa <signature> <comment>і може бути створений шляхом перестановки відформатованого файлу SSH-2.

Відновлення публічних ключів

Якщо ви використовуєте ssh-agent, ви, ймовірно, також матимете доступ до ssh-keygen.

Якщо у вас є ваш приватний ключ ( id_rsaфайл) OpenSSH, ви можете створити файл відкритого ключа OpenSSH, використовуючи:

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

Якщо у вас є лише приватний ключ ( id_rsa.ppkфайл) PUTTY, спочатку його потрібно конвертувати.

  1. Відкрийте генератор ключів PuTTY
  2. У рядку меню натисніть "Файл"> "Завантажити приватний ключ"
  3. Виберіть id_rsa.ppkфайл
  4. У рядку меню натисніть "Конверсії"> "Експортувати ключ OpenSSH"
  5. Збережіть файл як id_rsa(без розширення)

Тепер, коли у вас є закритий ключ OpenSSH, ви можете використовувати ssh-keygenінструмент, як описано вище, для виконання маніпуляцій з ключем.

Бонус: Формат відкритого ключа, кодований PEM-кодом PKCS # 1

Чесно кажучи, я не знаю, для чого використовується цей ключ, оскільки він мені не потрібен. Але я це маю в своїх замітках, які я зібрав протягом багатьох років, і включу їх сюди для корисного добра. Файл буде виглядати так:

-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5Ew
gnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8D
Gm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48
ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8
hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D
6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElwIBJQ==
-----END RSA PUBLIC KEY-----

Цей файл можна згенерувати за допомогою приватного ключа OpenSSH (як згенеровано в "Відновлення відкритих ключів" вище), використовуючи:

ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem

Крім того, ви можете використовувати відкритий ключ OpenSSH, використовуючи:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem

Список літератури:


Коли ви перетворюєте свій приватний ключ на ключ OpenSSH, на мій погляд, рекомендую залишити файл без розширення і не бажано. Мій git-клієнт не підключається до віддаленого сховища, коли розширення використовується для приватного ключа.
Programmer1994,

@ Programmer1994 Інструкції з перетворення були включені як кроки для перетворення файлу .ppkу .pubфайл. Побічний ефект id_rsaприватного ключа посередника, який фактично використовується іншою програмою, був пропущений. Я змінив мову "бажано без розширення" на "(без розширення)", щоб усунути будь-яку неясність. Я також скористався шансом переформулювати деякі скарги, які виникають щоразу, коли я озираюся на цю відповідь. Дякуємо за ваш внесок.
samthecodingman

Дякую за відповідь. Я використав команду у розділі вашої відповіді "Відновлення відкритих ключів", і це вирішило мою проблему.
desmond13

ви говорили про відкриті ключі. але проблема генерується із закритого ключа id_rsa. Я отримую те саме попередження, коли використовую свій приватний ключ ssh при спробі отримати доступ до git-сервера через ssh.
ahnbizcad

5
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pubце вирішило це. ДЯКУЮ!
Dwza

15

Існує просте рішення, якщо ви можете встановити та використовувати інструмент puttygen. Нижче наведені кроки. Ви повинні мати парольну фразу приватного ключа.

Крок 1: Завантажте останню версію puttygen і відкрийте puttygen

Крок 2: Завантажте існуючий файл приватного ключа, див. зображення нижче

Завантажте існуючий приватний ключ

Крок 3: Введіть парольну фразу для ключа, якщо запитаєте, і натисніть OK

введіть паафразу

крок 4: як показано на зображенні нижче, виберіть вкладку меню "перетворення" та виберіть "Експортувати ключ OpenSSH"

зберегти файл OpenSSH

Збережіть новий файл приватного ключа у бажаному місці та використовуйте відповідно.


2
Я отримав load pubkey invalid formatпопередження, коли експортував ключ за допомогою ключа Експортувати OpenSSH . Він зник при використанні ключа експорту OpenSSH (примусити новий формат файлу) .
elsamuko

У Linux, apt install putty-toolsабо yum install puttyтодіsudo puttygen private.ppk -O private-openssh-new -o private.pem
Typel

8

TL; DR: також переконайтеся, що ви id_rsa.pubперебуваєте у ascii / UTF-8.

У мене була та сама проблема, однак прийнята відповідь сама по собі не спрацювала через кодування тексту, що було додатковою проблемою, яку легко пропустити.

Коли я біжу

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

у Windows PowerShell він зберігає результати id_rsa.pubв кодуванні UTF-16 LE BOM , а не в UTF-8 . Це властивість деяких інсталяцій PowerShell, про що йшлося в розділі Використання PowerShell для написання файлу в UTF-8 без специфікації . Очевидно, OpenSSH не розпізнає попереднє кодування тексту і видає ідентичну помилку:

key_load_public: invalid format

Копіювання та вставка вихідних даних ssh-keygen -f ~/.ssh/id_rsa -yу текстовий редактор - це найпростіший спосіб вирішити цю проблему.

PS Це може бути доповненням до прийнятої відповіді , але у мене поки що недостатньо карми, щоб коментувати тут.


1
Як ви виявили, трубопроводи працюють по-різному в Powershell. Ви б використали ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pubзамість цього.
samthecodingman

7

У випадку, якщо ви скопіюєте свій відкритий ключ із буфера обміну та вставите його, може статися, що рядок відкритого ключа може бути порушений, що містить новий рядок.

Переконайтеся, що рядок вашого відкритого ключа сформований у один рядок.


5

Здається, sshви не можете прочитати ваш відкритий ключ. Але це не має значення.

Ви завантажуєте свій відкритий ключ на github, але аутентифікуєтесь за допомогою приватного ключа . Див., Наприклад, розділ ФАЙЛИ у ssh(1).


2
Коротше кажучи, перейдіть до ключа putty gen, натисніть перетворення -> відкрийте ключ ssh і збережіть його в id_rsa - переконайтеся, що змінна HOME env вказує на папку .ssh, яку ви переглядаєте, видаліть усі інші копії файлу id_rsa з вашої системи
Калпеш Соні

2

Замість прямого збереження приватного ключа перейдіть до Конверсії та Експортуйте ключ SSh. Була та сама проблема, і це спрацювало для мене


1

У мене було таке саме попередження. Це був дуже старий ключ. Я відновив ключ на поточному OpenSSH 7, і помилка зникла.


1

Помилка вводить в оману - в ній пише " pubkey", вказуючи на файл приватного ключа ~/.ssh/id_rsa.

У моєму випадку це був просто відсутній відкритий ключ (оскільки я не відновлював його зі сховища).


ДЕТАЛІ

Раніше я пропускав розгортання ~/.ssh/id_rsa.pubза допомогою автоматизованих сценаріїв.

Усі sshзвичаї спрацювали, але помилка змусила мене задуматись про можливий безлад.

Зовсім не - straceдопоміг помітити, що тригером насправді був *.pubфайл:

strace ssh example.com
...
openat(AT_FDCWD, "/home/uvsmtid/.ssh/id_rsa.pub", O_RDONLY) = -1 ENOENT (No such file or directory)
...
write(2, "load pubkey \"/home/uvsmtid/.ssh/"..., 57) = 57
load pubkey "/home/uvsmtid/.ssh/id_rsa": invalid format

0

Отже, після оновлення у мене виникла та сама проблема. Я використовував PEM key_fileбез розширення і просто додавав .pemвиправлену проблему. Тепер файл key_file.pem.


0

Якщо ви використовуєте Windows 10 із вбудованим SSH, станом на серпень 2020 року він підтримує лише клавіші ed25519. Ви отримаєте key_load_public: invalid formatпомилку, якщо використовуєте, наприклад, ключ RSA.

Згідно цією проблемою GitHub, вона повинна бути виправлена ​​через Windows Update деякий час у 2020 році. Одним із рішень є просто почекати, поки оновлення надійде.

Якщо ви не можете дочекатися, обхідним шляхом є створення нового ключа ed25519, що в будь-якому випадку є гарною порадою .

> ssh-keygen -o -a 100 -t ed25519

Ви можете використовувати його з, наприклад, github, але деякі старі системи можуть не підтримувати цей новий формат.

Після створення ключа, якщо ви використовуєте будь-яку з наведених нижче функцій, не забудьте їх оновити!

  1. ~\.ssh\config все ще може вказувати на старий ключ.
  2. Додайте новий ключ до ssh-agent за допомогою ssh-addкоманди
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.