Próbuję użyć Jsch do ustanowienia połączenia SSH w Javie. Mój kod generuje następujący wyjątek:
com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.com.
RSA key fingerprint is 22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4
Nie mogę znaleźć sposobu weryfikacji klucza hosta w dokumentacji Jsch. Poniżej zamieściłem mój kod.
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class ssh {
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
//create SSH connection
String host = "mywebsite.com";
String user = "username";
String password = "123456";
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.connect();
} catch(Exception e) {
System.out.println(e);
}
}
}
Odpowiedzi:
Chciałbym:
ssh
z wiersza poleceń i zaakceptuj klucz publiczny (host zostanie dodany~/.ssh/known_hosts
i wszystko powinno działać dobrze z Jsch) -LUB-Skonfiguruj JSch tak, aby nie używał „StrictHostKeyChecking” (wprowadza to niepewność i powinno być używane tylko do celów testowych), używając następującego kodu:
Opcja nr 1 (dodanie hosta do
~/.ssh/known_hosts
pliku) ma moje preferencje.źródło
JSch#setConfig("StrictHostKeyChecking", "no")
wykona tę samą pracę, ale tylko w jednej linii~/.ssh/config
plik, aby naprawić powyższy błąd, gdy nie miałem dostępu do modyfikacji kodu źródłowegoChociaż udzielono ogólnej odpowiedzi na pytanie, stwierdziłem, że jest przypadek, w którym nawet istniejący wpis known_hosts nie pomaga. Dzieje się tak, gdy serwer SSH wysyła odcisk palca ECDSA, w wyniku czego otrzymasz taki wpis:
Problem w tym, że JSch preferuje SHA_RSA i podczas łączenia spróbuje porównać odcisk palca SHA-RSA, co zakończy się błędem o "nieznanym hoście".
Aby to naprawić, po prostu uruchom:
lub narzekać na Jcraft, że preferuje SHA_RSA zamiast używania lokalnego ustawienia HostKeyAlgorithms , chociaż nie wydaje się, aby byli zbyt chętni do naprawiania swoich błędów .
źródło
ecdsa-sha2-nistp384
, a Twoje rozwiązanie działa bardzo dobrze. Zgodnie z instrukcją openssh-keyscan i naszymi potrzebami, uruchamiamyssh-keyscan -t rsa,ecdsa example.org >> known_hosts
.Unikanie sprawdzania klucza hosta stanowi zagrożenie bezpieczeństwa.
JSch używa interfejsu HostKeyRepository i jego domyślnej implementacji klasy KnownHosts do zarządzania tym. Możesz zapewnić alternatywną implementację, która zezwala na określone klucze, implementując HostKeyRepository. Lub możesz zachować klucze, które chcesz zezwolić, w pliku w formacie znane_hosty i wywołać
Lub z ciągiem klucza publicznego, jak poniżej.
zobacz Javadoc, aby uzyskać więcej informacji.
Byłoby to bezpieczniejsze rozwiązanie.
Jsch jest oprogramowaniem typu open source i możesz pobrać źródło stąd . W folderze z przykładami poszukaj KnownHosts.java, aby poznać więcej szczegółów.
źródło
W zależności od programu używanego do ssh, sposób uzyskania właściwego klucza może się różnić. Putty (popularny w systemie Windows) używa własnego formatu kluczy ssh. W przypadku większości wariantów Linuksa i BSD, które widziałem, wystarczy zajrzeć
~/.ssh/known_hosts
. Zwykle ssh z komputera z systemem Linux, a następnie kopiuję ten plik na komputer z systemem Windows. Następnie używam czegoś podobnego doZakładając, że umieściłem plik
C:\Users\cabbott
na moim komputerze z systemem Windows. Jeśli nie masz dostępu do komputera z systemem Linux, spróbuj http://www.cygwin.com/Może ktoś inny zasugeruje inną alternatywę dla systemu Windows. Uważam, że sposób obsługi kluczy SSH przez putty poprzez przechowywanie ich w rejestrze w niestandardowym formacie jest kłopotliwy do wyodrębnienia.
źródło
cygwin
(musisz pobraćopenssl
pakiet i zależności) udało mi się pobrać~/.ssh/known_hosts
. Dzięki @CharityAbbott.Podaj publiczny klucz rsa hosta: -
źródło
Możesz też po prostu to zrobić
Nie jest to bezpieczne i jest obejściem, które nie jest odpowiednie dla środowiska na żywo, ponieważ spowoduje wyłączenie sprawdzania kluczy hostów znanych na całym świecie.
źródło
Możesz również wykonać następujący kod. Jest przetestowany i działa.
Proszę podstawić odpowiednie wartości.
źródło
Wystarczy podstawić „użytkownik”, „przepustka”, „SSHD_IP”. I stwórz plik o nazwie known_hosts.txt z zawartością ~ / .ssh / known_hosts serwera. Otrzymasz muszlę.
źródło
config.put("StrictHostKeyChecking", "no");
. Ręcznessh -v
połączenie ujawnia, że.ssh/known_hosts
plik zawiera klucz (ecdsa-sha2-nistp256
), ale kod robi to:com.jcraft.jsch.JSchException: UnknownHostKey: 131.132.x.x. RSA key fingerprint is c2:...
at com.jcraft.jsch.Session.checkHost(Session.java:805)
at com.jcraft.jsch.Session.connect(Session.java:345)
ustawienie znanego hosta jest lepsze niż ustawienie wartości wydruku palca.
Po ustawieniu znanego hosta spróbuj ręcznie ssh (za pierwszym razem, przed uruchomieniem aplikacji) z pola, w którym działa aplikacja.
źródło
Straciłem dużo czasu na tym głupim problemie i myślę, że wiadomość jest całkiem poprawna „w pliku, do którego uzyskuję dostęp nie ma hosta”, ale możesz mieć więcej niż plik know_host w swoim systemie (na przykład i Używam mobaXterm i zachowuje swój własny w katalogu instalacyjnym, montując dom z tego katalogu głównego).
Jeśli doświadczasz: działa z wiersza poleceń, ale nie z poziomu aplikacji, spróbuj uzyskać dostęp do zdalnego serwera za pomocą ssh i sprawdź za pomocą opcji verbose -v, który plik jest obecnie używany, przykład poniżej:
jak widać klucz został znaleziony w:
a nie w moim domu Windows w C: \ Users \ my_local_user \ .ssh, po prostu połączyłem je i wyrównałem, aby rozwiązać problem.
Mam nadzieję, że to pomoże komuś w przyszłości
źródło
Ten wpis stackoverflow dotyczy sprawdzania klucza hosta i nie ma związku z uwierzytelnianiem za pomocą klucza publicznego.
Jeśli chodzi o uwierzytelnianie za pomocą klucza publicznego, wypróbuj poniższy przykład ze zwykłym (niezaszyfrowanym) kluczem prywatnym,
źródło
źródło