Сообщение об ошибке
Load key "/path/to/key": invalid format
Путь подставляется при каждом вызове. Формулировка зависит от криптографической библиотеки, с которой собран OpenSSH: с OpenSSL 1.1 или LibreSSL (macOS) при любой из причин ниже выводится «invalid format»; сборки с OpenSSL 3 (Ubuntu 22.04 и новее, Debian 12 и новее) для большинства из них выводят «error in libcrypto» и сохраняют «invalid format» для повреждённых ключей в формате PEM. Изменённый символ внутри тела ключа на всех сборках даёт «unknown or unsupported key type».
OpenSSH — ssh, ssh-keygen, ssh-add
Что это означает
OpenSSH попытался загрузить файл закрытого ключа и не смог разобрать его ни в одном из известных ему форматов (OPENSSH PRIVATE KEY, PKCS#8, устаревший PEM). Файл повреждён, обрезан, записан в чужом формате вроде .ppk от PuTTY, или это вообще не закрытый ключ — это ошибка формата файла, которая возникает ещё до запроса парольной фразы и до любого обмена с сервером.
Почему это происходит
Ключ повреждён при копировании
частоКлючи, переданные через чат, почту или терминалы, теряют завершающие переводы строк, получают лишние переносы или типографские символы либо лишаются последних дефисов. Тело блока закрытого ключа OPENSSH PRIVATE KEY в base64 чувствительно к длине: один потерянный символ портит весь файл. (Классическая причина — уже одно лишь отсутствие перевода строки в конце.)
Файл PuTTY .ppk используется с OpenSSH
частоФормат ключей PuTTY («PuTTY-User-Key-File-2: ...») отличается от формата OpenSSH. Если указать в ssh -i файл .ppk, ошибка возникнет именно здесь; ключ нужно один раз преобразовать.
Открытый ключ там, где должен быть закрытый ключ
частоssh -i id_ecdsa.pub (файл .pub) или строка из authorized_keys, сохранённая как файл ключа: функция загрузки закрытых ключей находит в файле открытый ключ и сообщает invalid format.
Обрезанный или не до конца синхронизированный файл
иногдаФайл ключа, обрезанный посередине тела при синхронизации через облако или при прерванном копировании через scp, разбирается как мусор. Воспроизведено: обрезка исправного файла ключа даёт именно «invalid format» в OpenSSH 8.4 и в macOS.
Как исправить
- 1.
Сначала проверьте обрамление
Первая и последняя строки вместе с пробной проверкой (-y выводит открытый ключ тогда и только тогда, когда закрытый ключ разбирается) за секунды показывают, к какому классу относится ошибка.
bash head -1 ~/.ssh/id_ecdsa # -----BEGIN OPENSSH PRIVATE KEY----- tail -c 50 ~/.ssh/id_ecdsa | xxd | tail -1 # must end with 0a (newline) ssh-keygen -y -f ~/.ssh/id_ecdsa # parses? prints the public key - 2.
Преобразуйте ключи PuTTY в формат OpenSSH
Однократное преобразование с помощью puttygen; после него ключ работает с ssh, ssh-add и ssh-agent.
bash puttygen key.ppk -O private-openssh -o ~/.ssh/id_converted chmod 600 ~/.ssh/id_converted - 3.
Передавайте ключи без потерь
Переносите файлы ключей через scp/rsync, а не через буфер обмена, оставляйте права 600, а если закрытый ключ не восстановить, сгенерируйте новую пару — современный OpenSSH отдаёт предпочтение Ed25519.
bash scp -p old-host:~/.ssh/id_ecdsa ~/.ssh/ # or start clean: ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519