Odcisk palca klucza PEM ssh

30

Mam plik PEM, który dodaję do działającego agenta ssh:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

Jak mogę uzyskać odcisk palca klucza (który widzę w ssh-agent) bezpośrednio z pliku? Wiem, że ssh-keygen -l -f some_keydziała dla „normalnych” kluczy ssh, ale nie dla plików PEM.

Jeśli spróbuję ssh-keygen na pliku .pem, otrzymam:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Ten klucz zaczyna się od:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

w przeciwieństwie do „zwykłego” klucza prywatnego, który wygląda następująco:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.
Nieznany
źródło
Dlaczego uważasz, że to nie działa w przypadku plików PEM? Jaki błąd występuje podczas próby? .ssh/id_rsaPlik generowany przez OpenSSH wykorzystując wszystkie domyślne to plik PEM. Klucze prywatne są domyślnie zakodowane w PEM. W rzeczywistości możesz używać kluczy RSA generowanych za pomocą OpenSSL bezpośrednio za pomocą OpenSSH.
Zoredache
zaktualizowano opis z danymi wyjściowymi z ssh-keygen na .pem
Nieznany
(późno, ale nekro) @Zoredache: Przed 7.2 (w 2016 r., po tym ssh-keygen -lpytaniu ) nie można odczytać pliku klucza prywatnego, chociaż robią to inne ssh-keygen(i ssh*) operacje. Ale gdy ssh-keygen generuje klucz, zapisuje zarówno plik klucza prywatnego np. Jak id_rsa i odpowiedni plik klucza publicznego z .pubdodanym np id_rsa.pub. Starsze ssh-keygen -l będzie spróbować dodać .pubdo nazwy pliku można określić i czytając ten plik PublicKey.
dave_thompson_085

Odpowiedzi:

34

Jeśli chcesz odzyskać odcisk palca utraconego pliku klucza publicznego, możesz go odzyskać z pliku klucza prywatnego :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Następnie możesz ustalić publiczny odcisk palca:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

W niektórych nowszych systemach drukuje odcisk palca SHA256 klucza. Możesz wydrukować odcisk palca MD5 klucza (formularz dwukropka), używając opcji -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

Lub jako jeden wiersz poleceń :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)
ominug
źródło
@ Odpowiedź MikeD jest właściwie „poprawną” odpowiedzią na to, czego szukał PO (i czego szukałem). AWS zapewnia odcisk palca w formacie, który pokazał, z parami cyfr oddzielonymi dwukropkami. Jego rozwiązanie (wzięte z dostarczonej strony AWS) również generuje odcisk palca w ten sam sposób, dzięki czemu można poprawnie zweryfikować.
Mike Williamson
50

Weryfikacja odcisku palca pary kluczy ” firmy AWS zawiera dwa jednolinijki, które rozwiązują problem, w zależności od sposobu utworzenia klucza.

Jeśli utworzyłeś parę kluczy za pomocą AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Lub, jeśli utworzyłeś parę kluczy za pomocą narzędzia innej firmy:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(odciski palców zredagowane na wydruku powyżej)

Mike D.
źródło
6

Oto jedna linijka, która powinna robić, co chcesz, bez konieczności lokalnego tworzenia pliku klucza publicznego.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Wykorzystuje ciąg bash tutaj <<<, aby stdin był dostępny jako zwykły plik ( /dev/stdin), a nie jako potok, ponieważ ssh-keygenbędzie działał tylko na pliku.

Od wydania 7.2 openssh ssh-keygen obsługuje pobieranie odcisków palców ze standardowego wejścia:

  • ssh-keygen (1): zezwól na pobieranie odcisków palców ze standardowego wejścia, np. „ssh-keygen -lf -”

Zauważ, że to polecenie zostanie zerwane z kluczami prywatnymi, które używają hasła i nie używają agenta. Powinien działać z plikami pem generowanymi przez AWS lub OpenStack, które nie używają haseł.

Aby uzyskać więcej informacji, zobacz https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin .

htaccess
źródło
Informacje o wydaniu nie mówiły, ale według źródła w wersji 7.2 -lobsługuje także czytanie pliku klucza prywatnego (ale nie ze standardowego wejścia).
dave_thompson_085
2

Odcisk palca nie jest pobierany z pliku klucza prywatnego, ale z pliku klucza publicznego.

W rzeczywistości ssh-keygen powiedział ci już:

./query.pem nie jest plikiem klucza publicznego.

Uruchom go przeciwko publicznej połowie klucza i powinien działać.

Mówiąc bardziej ogólnie

Pomyśl o tym: powodem istnienia odcisku palca jest to, że możesz zidentyfikować klucz publiczny. W rzeczywistości uzyskanie skrótu klucza prywatnego jest potencjalnym problemem bezpieczeństwa obok bycia bezużytecznym dla serwera (który nawet NIE MA tego klucza prywatnego).

Po uzyskaniu klucza publicznego proces polega na sprawdzeniu, czy klient blokuje odpowiednią połowę prywatną. Ponieważ już wiesz, które klucze próbujesz zweryfikować, nie potrzebujesz odcisku palca.

Stephane
źródło
Problem polega na tym, że nie mam klucza publicznego dla tego prywatnego :( I inna rzecz, ssh-keygendziała na pliku klucza prywatnego RSA, który zawiera dodatkowe informacje na początku (patrz mój początkowy post), ale nie na tym. .
Nie wiadomo
Nic więc nie możesz na to poradzić. Nie możesz pobrać publicznej połowy klucza z części prywatnej tak samo, jak nie możesz zrobić odwrotnie.
Stephane
3
To jest niepoprawne Jak @ominug wskazał powyżej, ssh-keygen -yfrobi to.
Steve Bennett,
4
@Stephane Chociaż poprawne na czystym poziomie RSA, w praktyce sposób przechowywania kluczy w specyfikacji PKCS, format kluczy prywatnych obejmuje oba klucze. Porównaj specyfikacje prywatne i publiczne
Håkan Lindqvist
„Nie możesz zdobyć publicznej połowy klucza z części prywatnej ...” - och tak, prawdopodobnie możesz. Weź moduł z klucza prywatnego i użyj 65537 jako wykładnika publicznego, a są szanse, że znalazłeś klucz publiczny.
Jim Flood