Jak sprawdzić, czy para kluczy publiczny / prywatny RSA jest zgodna

71

Mam dwa pliki id_rsai id_rsa.pub. Jakiego polecenia można użyć do sprawdzenia poprawności, jeśli są one prawidłową parą?

Ryan
źródło
Potwierdzę odpowiedź Michuelnika; dzięki temu nie musiałem tworzyć nowej pary kluczy. ssh -vteż bardzo pomaga.
Chris K,

Odpowiedzi:

91

Wolę ssh-keygen -y -e -f <private key>sposób zamiast akceptowanej odpowiedzi Jak testować publiczną / prywatną parę kluczy DSA? na przepełnienie stosu.

ssh-keygen -y -e -f <private key>pobiera klucz prywatny i drukuje odpowiedni klucz publiczny, który można bezpośrednio porównać z dostępnymi kluczami publicznymi. (Wskazówka: strzeż się komentarzy i kluczowych opcji).

(Jak do diabła to robi? Mogę mieć tylko nadzieję, że klucz publiczny jest zakodowany bezpośrednio lub pośrednio w kluczu prywatnym ...)

Sam tego potrzebowałem i użyłem następującego linera Bash. Nie powinien wypisywać niczego, jeśli klucze należą do siebie. Zastosuj trochę -qdo diff w skryptach, a diff tylko odpowiednio ustawia kod powrotu.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )
Michuelnik
źródło
1
@MichaelHampton: teraz rozumiem twój komentarz. „zaakceptowana odpowiedź” powinna odnosić się do pytania o
przepełnienie stosu, a
1
@Sirch: Myślałem, że decyzja, który klucz jest prywatny, a który publiczny, jest czysto losowa, ponieważ dwa klucze są równe. To, co szyfruje jeden klucz, można odszyfrować tylko drugim. A jeśli jeden klucz można by uzyskać od drugiego, to wszystko by się nie udało.
Michuelnik
1
@Michuelnik Możesz uzyskać klucz publiczny z klucza prywatnego. Nie możesz uzyskać klucza prywatnego z klucza publicznego. Nie mówiliśmy o materiale, który szyfruje.
Sirch,
1
@Michuelnik imho, pytanie jest nie na temat na SO i na temat tutaj (i / lub Superuser). imho, nie powinien być oznaczony jako duplikat i zamiast tego oznaczony tam do migracji. Ale dotyczy to obu, więc lubię pełniejsze udostępnianie informacji.
Chris K,
10
Tak długo, jak istnieje ssh-keygen -y -e -f id_rsaplik id_rsa.pub , nie będzie w ogóle sprawdzał pliku id_rsa.pub, ale po prostu zwróci wartość z pliku id_rsa.pub. Tak więc np. Jeśli chcesz echo 5 > id_rsausunąć klucz prywatny, to wykonaj diff, diff przejdzie! Również uruchamianie ssh-keygen -yef footam , gdzie foo nie jest prawidłowym kluczem (i nie ma odpowiadającego foo.pub), blokuje oczekiwanie na dane wejściowe użytkownika, więc należy zachować ostrożność, używając go w skrypcie.
31

W zależności od tego, skąd otrzymujesz testowany plik klucza publicznego, zaakceptowana odpowiedź może dać fałszywie pozytywne wyniki. Wynika to z zachowania opisanego w komentarzu @drewbenn. W szczególności, gdy opcja -e jest używana z plikiem klucza prywatnego jako parametrem opcji -f, po prostu papuguje (ale formatuje) to, co jest w powiązanym pliku klucza publicznego.

Innymi słowy,

ssh-keygen -y -f id_rsa

(najwyraźniej) generuje wartość klucza publicznego, oraz

ssh-keygen -y -e -f id_rsa

po prostu i wypisuje (i formatuje) klucz w istniejącym pliku id_rsa.pub, cokolwiek to jest .

W moim przypadku muszę sprawdzić, czy para nie została uszkodzona. Postanowiłem więc porównać następujące elementy:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

z

cut -d' ' -f 2 id_rsa.pub

W związku z tym:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

Być może nie jest to tak elastyczne, ale lepiej dla moich potrzeb. Może to pomaga komuś innemu.

twildfarmer
źródło
5
To naprawdę powinno zastąpić przyjętą odpowiedź lub przynajmniej przewyższyć ją pod względem głosów pozytywnych.
thomanski
Dziękuję Ci! To polecenie nie działa z kluczami z hasłem, nie wymaga tego interaktywnie. Wyodrębniłem zawartość dwóch () poleceń do plików i udostępniłem je, co działa.
Yaroslav Nikitenko
5

Jeśli są w systemie lokalnym, trzymać id_rsa.pubw twojej $HOME/.ssh/authorized_keysi sshdo localhostkorzystania z id_rsaklucza. Jeśli to działa, to pasują do siebie.

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
Michael Hampton
źródło