key_load_public: недопустимый формат


98

Я использовал PuTTY Key Generator для генерации 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. Вы можете запустить «ключ файла», чтобы узнать формат файла ключа.
мош

Ответы:


181

Как упомянул Роланд в своем ответе, это предупреждение о том, что ssh-agentон не понимает формат открытого ключа, и даже в этом случае открытый ключ не будет использоваться локально.

Тем не менее, я также могу уточнить и ответить, почему это предупреждение. Это просто сводится к тому, что генератор ключей PuTTY генерирует два разных формата открытых ключей в зависимости от того, что вы делаете в программе.

Примечание. В моем объяснении ключевые файлы, которые я буду использовать / генерировать, будут именоваться id_rsaс соответствующими расширениями. Кроме того, для удобства копирования и вставки предполагается, что родительская папка ключей - это ~/.ssh/. Отрегулируйте эти детали в соответствии со своими потребностями.

Форматы

Ссылка на соответствующую документацию PuTTY

СШ-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.

Если у вас есть закрытый ключ OpenSSH ( id_rsaфайл), вы можете создать файл открытого ключа OpenSSH, используя:

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

Если у вас есть только закрытый ключ PUTTY ( id_rsa.ppkфайл), вам нужно сначала его преобразовать.

  1. Откройте генератор ключей PuTTY.
  2. В строке меню нажмите «Файл»> «Загрузить закрытый ключ».
  3. Выберите ваш id_rsa.ppkфайл
  4. В строке меню нажмите «Конверсии»> «Экспорт ключа OpenSSH».
  5. Сохраните файл как id_rsa(без расширения)

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

Бонус: формат открытого ключа PKCS # 1 с кодировкой PEM

Честно говоря, я не знаю, для чего используется этот ключ, потому что он мне не нужен. Но у меня есть это в своих записях, которые я собирал на протяжении многих лет, и я включу его сюда для благости. Файл будет выглядеть так:

-----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-client не будет подключаться к удаленному репозиторию, когда для закрытого ключа используется расширение.
Programmer1994,

@ Programmer1994 инструкции преобразования были включены в качестве шагов , чтобы преобразовать .ppkв .pubфайл. Побочный эффект промежуточного id_rsaзакрытого ключа, фактически используемого другой программой, не учитывался. Я изменил язык «предпочтительно без расширения» на «(без расширения)», чтобы устранить двусмысленность. Я также воспользовался шансом перефразировать некоторые недовольства, возникающие всякий раз, когда я оглядываюсь на этот ответ. Спасибо за ваш вклад.
samthecodingman 01

Спасибо за ответ. Я использовал команду из раздела вашего ответа «Восстановление открытых ключей», и это решило мою проблему.
desmond13

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

5
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pubэто решило это. СПАСИБО!
Dwza

15

Есть простое решение, если вы можете установить и использовать инструмент puttygen. Ниже приведены шаги. У вас должна быть кодовая фраза закрытого ключа.

Шаг 1: Загрузите последнюю версию puttygen и откройте puttygen

Шаг 2: Загрузите существующий файл закрытого ключа, см. изображение ниже

Загрузить существующий закрытый ключ

Шаг 3: Введите кодовую фразу для ключа, если ее спросят, и нажмите ОК

введите паасфразу

Шаг 4: как показано на изображении ниже, выберите вкладку меню «Преобразование» и выберите «Экспорт ключа OpenSSH»

сохранить файл OpenSSH

Сохраните новый файл закрытого ключа в предпочтительном месте и используйте его соответствующим образом.


2
Я получил load pubkey invalid formatпредупреждение, когда экспортировал ключ с помощью ключа Export OpenSSH . Он исчез при использовании ключа Export 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
Короче говоря, перейдите к генерации ключа шпатлевки, щелкните преобразования -> откройте ключ ssh и сохраните его в id_rsa - убедитесь, что ваша переменная HOME env указывает на папку .ssh, которую вы просматриваете, удалите все другие копии файла id_rsa из вашей системы
Kalpesh Soni

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 где-то в 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.