key_load_public: nieprawidłowy format

99

Użyłem generatora kluczy PuTTY do wygenerowania 4096-bitowego klucza RSA-2 z hasłem.

Zapisuję plik .ppk i klucz publiczny w formacie openSSL. Klucz publiczny w formacie kitu nie działa.

W każdym razie mój błąd jest następujący:

$ ssh -T [email protected]
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.

W czym problem?

Używam Pageant do ładowania kluczy i używam Git Bash do wypróbowania połączenia ssh. Załadowałem również klucz do GitHub, nie jestem pewien, co robię źle.

Próbowałem dodać nową linię i nie dodawać nowej linii w GitHub

JordanGS
źródło
Jak myślisz, dlaczego to nie działa? Mówi, że pomyślnie uwierzytelniono .
Roland Smith
2
@RolandSmith Mówi mi key_load_public: invalid formatdobrze, gdy wykonuję polecenie, zanim wprowadzę hasło?
JordanGS
1
Zrób: „ssh -vvv -T [email protected]”, aby uzyskać więcej informacji, prawdopodobnie ~ / .ssh / known_hosts jest błędne - ssh szuka klucza publicznego github. Możesz uruchomić `` klucz pliku '', aby sprawdzić format pliku klucza.
mosh

Odpowiedzi:

183

Jak wspomniał Roland w swojej odpowiedzi, jest to ostrzeżenie, że ssh-agentnie rozumie formatu klucza publicznego i nawet wtedy klucz publiczny nie będzie używany lokalnie.

Mogę jednak również rozwinąć i odpowiedzieć, dlaczego jest to ostrzeżenie. Sprowadza się to po prostu do tego, że PuTTY Key Generator generuje dwa różne formaty kluczy publicznych w zależności od tego, co robisz w programie.

Uwaga: W całym moim wyjaśnieniu pliki kluczy, których będę używać / generować, będą miały nazwy id_rsaz odpowiednimi rozszerzeniami. Ponadto, dla wygody kopiowania i wklejania, zakłada się, że folder nadrzędny kluczy to ~/.ssh/. Dostosuj te szczegóły do ​​swoich potrzeb.

Formaty

Link do odpowiedniej dokumentacji PuTTY

SSH-2

Podczas zapisywania klucza za pomocą Generatora kluczy PuTTY za pomocą przycisku „Zapisz klucz publiczny”, zostanie on zapisany w formacie określonym przez RFC 4716 .

Przykład:

---- 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

Wbrew powszechnemu przekonaniu ten format nie jest zapisywany przez generator. Jednak jest generowany i wyświetlany w polu tekstowym zatytułowanym „Klucz publiczny do wklejania do pliku autoryzowanych kluczy OpenSSH”. Aby zapisać go jako plik, musisz ręcznie skopiować go z pola tekstowego i wkleić do nowego pliku tekstowego.

W przypadku klucza pokazanego powyżej wyglądałoby to następująco:

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

Format klucza jest prosty ssh-rsa <signature> <comment>i można go utworzyć, zmieniając format pliku w formacie SSH-2.

Regeneracja kluczy publicznych

Jeśli korzystasz z ssh-agent, prawdopodobnie będziesz mieć również dostęp do ssh-keygen.

Jeśli masz swój klucz prywatny OpenSSH ( id_rsaplik), możesz wygenerować plik klucza publicznego OpenSSH za pomocą:

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

Jeśli masz tylko klucz prywatny PUTTY ( id_rsa.ppkplik), musisz go najpierw przekonwertować.

  1. Otwórz generator kluczy PuTTY
  2. Na pasku menu kliknij „Plik”> „Załaduj klucz prywatny”
  3. Wybierz swój id_rsa.ppkplik
  4. Na pasku menu kliknij „Konwersje”> „Eksportuj klucz OpenSSH”
  5. Zapisz plik jako id_rsa(bez rozszerzenia)

Teraz, gdy masz już klucz prywatny OpenSSH, możesz użyć ssh-keygennarzędzia jak powyżej, aby wykonać manipulacje na kluczu.

Bonus: Format klucza publicznego zakodowany w PKCS # 1 PEM

Szczerze mówiąc, nie wiem, do czego służy ten klucz, ponieważ go nie potrzebowałem. Ale mam to w swoich notatkach, które zbierałem przez lata i dołączę to tutaj dla zdrowej dobroci. Plik będzie wyglądał następująco:

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

Ten plik można wygenerować przy użyciu klucza prywatnego OpenSSH (wygenerowanego w sekcji „Regenerowanie kluczy publicznych” powyżej) przy użyciu:

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

Alternatywnie możesz użyć klucza publicznego OpenSSH za pomocą:

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

Bibliografia:

samthecodingman
źródło
Kiedy konwertujesz swój klucz prywatny na klucz OpenSSH, moim zdaniem zaleca się pozostawienie pliku bez rozszerzenia i nie jest to preferowane. Mój klient git nie łączy się ze zdalnym repozytorium, gdy dla klucza prywatnego używane jest rozszerzenie.
Programmer1994
@ Programmer1994 Instrukcje konwersji zostały dołączone jako kroki konwersji .ppkdo .pubpliku. Przeoczono efekt uboczny pośredniego id_rsaklucza prywatnego faktycznie używanego przez inny program. Zmieniłem język „najlepiej bez rozszerzenia” na „(bez rozszerzenia)”, aby usunąć wszelkie niejasności. Skorzystałem również z okazji, aby przeformułować niektóre żale, które pojawiają się, gdy spojrzę wstecz na tę odpowiedź. Dziękuję za twój wkład.
samthecodingman
Dziękuję za odpowiedź. Użyłem polecenia z sekcji Twojej odpowiedzi „Regeneracja kluczy publicznych” i rozwiązało mój problem.
desmond13
mówiłeś o kluczach publicznych. ale problem jest generowany z klucza prywatnego id_rsa. Otrzymuję to samo ostrzeżenie, gdy używam mojego prywatnego klucza ssh, próbując uzyskać dostęp do serwera git przez ssh.
ahnbizcad
5
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pubto go rozwiązało. DZIĘKI!
Dwza
16

Istnieje proste rozwiązanie, jeśli możesz zainstalować i używać narzędzia puttygen. Poniżej znajdują się kroki. Powinieneś mieć hasło klucza prywatnego.

Krok 1: Pobierz najnowszy puttygen i otwórz puttygen

krok 2: Załaduj istniejący plik klucza prywatnego, patrz poniższy obrazek

Załaduj istniejący klucz prywatny

Krok 3: Wprowadź hasło dostępu do klucza, jeśli zostaniesz o to poproszony, i naciśnij OK

wprowadź paasphrase

krok 4: jak pokazano na poniższym obrazku wybierz zakładkę "konwersja" i wybierz "Eksportuj klucz OpenSSH"

zapisz plik OpenSSH

Zapisz nowy plik klucza prywatnego w preferowanej lokalizacji i użyj go odpowiednio.

PradeepNama
źródło
2
Otrzymałem load pubkey invalid formatostrzeżenie, kiedy wyeksportowałem klucz za pomocą Eksportuj klucz OpenSSH . To zniknęło podczas korzystania z eksportu klucza OpenSSH (wymuś nowy format pliku) .
elsamuko
W Linuksie apt install putty-toolslub yum install puttywtedysudo puttygen private.ppk -O private-openssh-new -o private.pem
Typel
9

TL; DR: upewnij się również, że jesteś id_rsa.pubw ascii / UTF-8.

Miałem ten sam problem, jednak sama zaakceptowana odpowiedź nie zadziałała z powodu kodowania tekstu, co było dodatkowym, łatwym do przeoczenia problemem.

Kiedy biegnę

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

w Windows PowerShell zapisuje dane wyjściowe id_rsa.pubw kodowaniu UTF-16 LE BOM , a nie w UTF-8 . Jest to właściwość niektórych instalacji programu PowerShell, która została omówiona w temacie Używanie programu PowerShell do zapisywania pliku w UTF-8 bez BOM . Najwyraźniej OpenSSH nie rozpoznaje poprzedniego kodowania tekstu i generuje identyczny błąd:

key_load_public: invalid format

Kopiowanie i wklejanie wyniku programu ssh-keygen -f ~/.ssh/id_rsa -ydo edytora tekstu to najprostszy sposób rozwiązania tego problemu.

PS To mógłby być dodatek do zaakceptowanej odpowiedzi , ale nie mam jeszcze wystarczającej karmy, aby tu komentować.

papierowe drzewa
źródło
1
Jak odkryłeś, orurowanie działa inaczej w programie PowerShell. Zamiast tego ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pubużyłbyś.
samthecodingman
7

W przypadku skopiowania klucza publicznego ze schowkiem i wklejenia go, może się zdarzyć, że ciąg klucza publicznego zostanie uszkodzony, który zawiera nową linię.

Upewnij się, że ciąg klucza publicznego jest utworzony jako jedna linia.

Hojin Choi
źródło
5

Wygląda na to, że sshnie może odczytać Twojego klucza publicznego. Ale to nie ma znaczenia.

Przesyłasz swój klucz publiczny na github, ale uwierzytelniasz się za pomocą klucza prywatnego . Zobacz np. Sekcję PLIKI w ssh(1).

Roland Smith
źródło
2
W skrócie, przejdź do generowania klucza putty, kliknij konwersje -> otwórz klucz ssh i zapisz go w id_rsa - upewnij się, że zmienna HOME env wskazuje na przeglądany folder .ssh, usuń wszystkie inne kopie pliku id_rsa z systemu
Kalpesh Soni
2

Zamiast bezpośrednio zapisywać klucz prywatny, przejdź do opcji Konwersje i Eksportuj klucz SSh. Miałem ten sam problem i to działało dla mnie

Jignesh Rawal
źródło
2

Błąd jest mylący - mówi „ pubkey”, wskazując na plik klucza prywatnego ~/.ssh/id_rsa.

W moim przypadku był to po prostu brakujący klucz publiczny (ponieważ nie przywróciłem go ze skarbca).


DETALE

Kiedyś pomijałem wdrażanie za ~/.ssh/id_rsa.pubpomocą automatycznych skryptów.

Wszystkie sshzwyczaje działały, ale błąd sprawił, że pomyślałem o możliwym bałaganie.

Wcale nie - stracepomogło zauważyć, że wyzwalaczem był w rzeczywistości *.pubplik:

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
uvsmtid
źródło
1

Miałem to samo ostrzeżenie. To był bardzo stary klucz. Ponownie wygenerowałem klucz na obecnym OpenSSH 7 i błąd zniknął.

arberg
źródło
0

Tak więc po aktualizacji miałem ten sam problem. Używałem PEM key_filebez rozszerzenia i po prostu dodanie .pemrozwiązało mój problem. Teraz plik jest key_file.pem.

furang
źródło
0

Jeśli używasz systemu Windows 10 z wbudowanym SSH, od sierpnia 2020 r. Obsługuje on tylko klucze ed25519. Pojawi się key_load_public: invalid formatbłąd, jeśli użyjesz np. Klucza RSA.

Jeśli chodzi o ten problem z GitHubem , powinien on zostać naprawiony przez Windows Update w 2020 roku. Tak więc jednym z rozwiązań jest po prostu poczekanie na wysłanie aktualizacji.

Jeśli nie możesz czekać, obejściem jest wygenerowanie nowego klucza ed25519, co i tak jest dobrą radą .

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

Możesz go używać np. Z github, ale niektóre starsze systemy mogą nie obsługiwać tego nowszego formatu.

Po wygenerowaniu klucza, jeśli używasz jednej z poniższych funkcji, nie zapomnij ich zaktualizować!

  1. ~\.ssh\config może nadal wskazywać na stary klucz.
  2. Dodaj nowy klucz do ssh-agent za pomocą ssh-addpolecenia
Wola
źródło