com.jcraft.jsch.JSchException: BilinmeyenHostKey


179

Java bir SSH bağlantısı kurmak için Jsch kullanmaya çalışıyorum . Kodum aşağıdaki özel durumu oluşturur:

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

Jsch belgelerinde ana bilgisayar anahtarını nasıl doğrulayacağımı bulamıyorum. Kodumu aşağıya ekledim.

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);
        } 
    }
}

* Nix ana makinenizde sshd'yi kapatmayı ve ön planda tek bir iş parçacığı başlatmayı deneyin: / usr / sbin / sshd -d Bu, sshd tarafından size çok sayıda hata ayıklama bilgisi verecektir.

@AmmSokun herkes bu sorunu çözebildi. Cevaplara bakın.
bmargulies

Yanıtlar:


226

Ben de:

  1. sshKomut satırından almaya çalışın ve ortak anahtarı kabul edin (ana bilgisayar eklenecektir ~/.ssh/known_hostsve her şey Jsch'den iyi çalışmalıdır) -VEYA-
  2. JSch'i aşağıdaki kodu kullanarak "StrictHostKeyChecking" kullanmayacak şekilde yapılandırın (bu, güvensizlikleri getirir ve yalnızca test amacıyla kullanılmalıdır):

    java.util.Properties config = new java.util.Properties(); 
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);

Seçenek # 1 (ana makineyi ~/.ssh/known_hostsdosyaya eklemek ) benim tercihimdir.


37
JSch#setConfig("StrictHostKeyChecking", "no")aynı işi yapacak, ama sadece bir satırda
yegor256 31:12

2
Yan not: ~/.ssh/configKaynak kodunu değiştirmek için erişimim olmadığında dosyamı yukarıdaki hatayı düzeltecek şekilde yapılandırmak için bu geri bildirimi kullandım
Adam Rofer

.Ssh / config dosyasına ne yaptınız? Aynı hatayı alıyorum.
Bernard Igiri

19
Bu güvensizdir ve gerçekten bu prensipte doğru cevap olarak seçilmemeliydi. SetKnownHosts () ve setFingerPrint () seçenekleri, ssh işleminin önemli bir yönünü göz ardı etmeden bunu yapmanın yoludur. Düzenleme: deneyimlerime göre, # 1 Eclipse gibi bazı IDE ortamlarında çalışmaz.
Rondo

1
Tutulma içinde benim için bir iş yaptı ... sadece bir test ortamında ihtiyacım olan şey ....
ProfVersaggi

46

Soru genel olarak cevaplanmış olsa da, kendime bilinen bilinen_hosts girişinin bile yardımcı olmadığı bir durum olduğunu gördüm . Bu, bir SSH sunucusu ECDSA parmak izi gönderdiğinde olur ve sonuç olarak aşağıdaki gibi bir girişiniz olur:

|1|+HASH=|HASH= ecdsa-sha2-nistp256 FINGERPRINT=

Sorun JSch SHA_RSA tercih ve bağlanırken SHA-RSA parmak izi karşılaştırmak için çalışacağız, hangi "bilinmeyen ana bilgisayar" hata ile sonuçlanır.

Bunu düzeltmek için şunu çalıştırın:

$ ssh-keyscan -H -t rsa example.org >> known_hosts

veya Jcraft'a yerel HostKeyAlgorithms ayarını kullanmak yerine SHA_RSA'yı tercih etmesinden şikayet ediyorlar , ancak hatalarını düzeltmek için çok istekli görünmüyorlar .


1
Biz de benzer bir durumdayız ecdsa-sha2-nistp384ve çözümünüz çok iyi çalışıyor. Buna göre openssh-keyscan kılavuzuna ve ihtiyacımız doğrultusunda koşuyoruz ssh-keyscan -t rsa,ecdsa example.org >> known_hosts.
taringamberini

1
Böyle bir sorun vardı, ama istisna değildi JSchException: konak anahtarı reddetmek: yerine UnknownHostKey: JSchException (bu durum bazı diğer kullanıcılara yardımcı olabilir)
bdulac

Ayrıca @krishnakumarp tarafından önerilen setKnownHosts dosyasını eklemek zorunda kaldım
Wolfgang Fahl

34

Ana bilgisayar anahtarı denetimini önlemek bir güvenlik riskidir.

JSch bunu yönetmek için HostKeyRepository arabirimini ve varsayılan uygulaması KnownHosts sınıfını kullanır. HostKeyRepository uygulamasını uygulayarak belirli anahtarlara izin veren alternatif bir uygulama sağlayabilirsiniz. Veya izin vermek istediğiniz anahtarları bir dosyada bilinen_anahtarlar biçiminde saklayabilir ve çağrı yapabilirsiniz.

jsch.setKnownHosts(knownHostsFileName);

Veya aşağıdaki gibi bir genel anahtar Dize ile.

String knownHostPublicKey = "mysite.com ecdsa-sha2-nistp256 AAAAE............/3vplY";
jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

görmek Javadoc fazla ayrıntı için.

Bu daha güvenli bir çözüm olacaktır.

JSch açık kaynak olduğunu ve gelen kaynak indirebilirsiniz burada . Örnekler klasöründe, daha fazla ayrıntı öğrenmek için KnownHosts.java dosyasını arayın.


16

Ssh için hangi programı kullandığınıza bağlı olarak, doğru anahtarı almanın yolu değişebilir. Macun (Windows ile popüler) ssh tuşları için kendi biçimlerini kullanır. Gördüğüm çoğu Linux ve BSD varyantıyla, sadece bakmak zorundasınız ~/.ssh/known_hosts. Genellikle bir Linux makinesinden ssh alıyorum ve daha sonra bu dosyayı bir Windows makinesine kopyalarım. Sonra benzer bir şey kullanıyorum

jsch.setKnownHosts("C:\\Users\\cabbott\\known_hosts");

Dosyayı C:\Users\cabbottWindows makineme yerleştirdiğimi varsayarsak . Bir Linux makinesine erişiminiz yoksa, http://www.cygwin.com/ adresini deneyin.

Belki bir başkası başka bir Windows alternatifi önerebilir. Macun anahtarlarını SSH anahtarlarını, kayıt defterinde ayıklamak için standart olmayan bir biçimde saklayarak işleme yolunu buluyorum.


Windows kullanarak windows üzerinde cygwin( opensslpaket ve bağımlılıkları indirmek zorunda) indirebildim ~/.ssh/known_hosts. @CharityAbbott'a teşekkürler.
taringamberini

10

Ev sahibinin genel rsa anahtarını sağlayın: -

String knownHostPublicKey = "mywebsite.com ssh-rsa AAAAB3NzaC1.....XL4Jpmp/";

session.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

1
Benim için jsch sürüm 0.1.50 (her zaman jsch bir NPE var) ile ama işe yaramadı yeni sürümü 0.1.53 ile çalışmadı.
Udo

Jsch kodu (Util.byte2str ()) UTF-8 kodlaması beklediğinde, bu (String.getBytes ()) unicode kodlu karakterlerden oluşan bir bayt dizisi sağlar mı?
zengin p

7

Ayrıca

session.setConfig("StrictHostKeyChecking", "no");

Güvenli değildir ve küresel olarak bilinen ana makine anahtarları denetimini devre dışı bırakacağı için canlı ortam için uygun olmayan bir çözümdür.


2
Bu kod soruyu yanıtlamaya yardımcı olsa da, yalnızca kod yanıtları yüksek kalitede değildir. Daha iyi bir yanıt, kodun ne yaptığını açıklar, nereye ekleyeceğini söyler, bu yaklaşımın neden alındığını açıklar ve ilgili belgelere bağlanır.
Stephen Ostermiller

6

Aşağıdaki kodu da yürütebilirsiniz. Test edilmiş ve çalışmaktadır.

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;

public class SFTPTest {

    public static void main(String[] args) {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession("username", "mywebsite.com", 22); //default port is 22
            UserInfo ui = new MyUserInfo();
            session.setUserInfo(ui);
            session.setPassword("123456".getBytes());
            session.connect();
            Channel channel = session.openChannel("sftp");
            channel.connect();
            System.out.println("Connected");
        } catch (JSchException e) {
            e.printStackTrace(System.out);
        } catch (Exception e){
            e.printStackTrace(System.out);
        } finally{
            session.disconnect();
            System.out.println("Disconnected");
        }
    }

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {

        @Override
        public String getPassphrase() {
            return null;
        }
        @Override
        public String getPassword() {
            return null;
        }
        @Override
        public boolean promptPassphrase(String arg0) {
            return false;
        }
        @Override
        public boolean promptPassword(String arg0) {
            return false;
        }
        @Override
        public boolean promptYesNo(String arg0) {
            return false;
        }
        @Override
        public void showMessage(String arg0) {
        }
        @Override
        public String[] promptKeyboardInteractive(String arg0, String arg1,
                String arg2, String[] arg3, boolean[] arg4) {
            return null;
        }
    }
}

Lütfen uygun değerleri değiştirin.


Evet, bunu referansım için ekledim. Bunu kaldıracağım. Teşekkürler.
Vishnu Prasad Kallummel

1
bu, klavye etkileşimli kimlik doğrulama yöntemi sunan belirli SSH Sunucularına bağlanırken bir tür garip kimlik doğrulama sorunları yarattı. Anahtar şeyden kurtulmak için yıllarca kullandım ve sonra bugün sadece belirli bir sunucu ile yakıldım. Çünkü PW getPassword () üzerinden değil, doğrudan Session nesnesine sağladı. Bunu aklınızda bulundurun. Artık kullanmazdım.
Marc

1

"Kullanıcı", "geçiş", "SSHD_IP" yerine geçmeniz yeterlidir. Ve sunucunun ~ / .ssh / bilinen_hosts içeriği ile bilinen_hosts.txt adlı bir dosya oluşturun. Bir kabuk alacaksın.

public class Known_Hosts {
public static void main(String[] arg) {
    try {
        JSch jsch = new JSch();
        jsch.setKnownHosts("known_hosts.txt");
        Session session = jsch.getSession("user", "SSHD_IP", 22);
        session.setPassword("pass");
        session.connect();
        Channel channel = session.openChannel("shell");
        channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        channel.connect();
    } catch (Exception e) {
        System.out.println(e);
    }
  }
}

Hayır, benim için çalışmıyor. Benzer şekilde, Eric Leschinski / Rakesh Acharya'nın cevabı ben yorum yapmazsa başarısız olur config.put("StrictHostKeyChecking", "no"); Manuel ssh -vbağlantı, .ssh/known_hostsdosyanın anahtarı ( ecdsa-sha2-nistp256) içerdiğini gösterir ancak kod bunu yapar: 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)
Urhixidur

13 Haziran 2013'te mevcut olan JSCH kütüphane sürümünü kullanmak bir süredir, muhtemelen o zamandan beri kütüphanede bir şeyler değişti
dalvarezmartinez1

1

bilinen ana makineyi ayarlamak parmak izi değerini ayarlamaktan daha iyidir.

Bilinen ana bilgisayarı ayarladığınızda, uygulamanın çalıştığı kutudan el ile ssh (uygulama çalıştırmadan önce ilk kez) deneyin.


1

Bu aptal konuda çok fazla zaman kaybettim ve mesaj oldukça doğru olduğunu düşünüyorum "erişiyorum dosyada ana bilgisayar yok" ama sisteminizde bir know_host dosyası daha fazla olabilir (örneğin i mobaXterm kullanıyorum ve bu kökten ev montaj kurulum dizini içinde kendi tutmak).

Eğer yaşıyorsanız: komut satırından çalışıyor ancak uygulamayı oluşturmuyor, ssh ile uzak sunucunuza erişmeye çalışın ve şu anda hangi dosyanın kullanıldığını ayrıntılı -v seçeneği ile kontrol edin:

 ssh -v git@gitlab.com
 OpenSSH_6.2p2, OpenSSL 1.0.1g 7 Apr 2014
 debug1: Reading configuration data /etc/ssh_config
 debug1: Connecting to gitlab.com [104.210.2.228] port 22.
 debug1: Connection established.
 debug1: identity file /home/mobaxterm/.ssh/id_rsa type 1
 debug1: identity file /home/mobaxterm/.ssh/id_rsa-cert type -1
 debug1: identity file /home/mobaxterm/.ssh/id_dsa type -1
 debug1: identity file /home/mobaxterm/.ssh/id_dsa-cert type -1
 debug1: identity file /home/mobaxterm/.ssh/id_ecdsa type -1
 debug1: identity file /home/mobaxterm/.ssh/id_ecdsa-cert type -1
 debug1: Enabling compatibility mode for protocol 2.0
 debug1: Local version string SSH-2.0-OpenSSH_6.2
 debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2      Ubuntu-4ubuntu2.1
 debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 pat OpenSSH*
 debug1: SSH2_MSG_KEXINIT sent
 debug1: SSH2_MSG_KEXINIT received
 debug1: kex: server->client aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
 debug1: kex: client->server aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
 debug1: sending SSH2_MSG_KEX_ECDH_INIT
 debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
 debug1: Server host key: RSA b6:03:0e:39:97:9e:d0:e7:24:ce:a3:77:3e:01:42:09
 debug1: Host 'gitlab.com' is known and matches the RSA host key.
 debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19
 debug1: ssh_rsa_verify: signature correct

gördüğünüz gibi anahtar bulundu:

debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19

ve Windows evimde C: \ Users \ my_local_user altında değil \ .ssh bunları birleştirdim ve sorunu çözmek için hizaladım.

Umarım bu gelecekte birine yardım eder


0

Bu sorunu çözen oldu mu? Ortak anahtar kimlik doğrulaması (parola kimlik doğrulaması kullanmak istemiyorum) kullanarak scp dosyaları Jscp kullanıyorum. Yardım takdir edilecektir !!!

Bu yığın akışı girişi, ana bilgisayar anahtarı denetimi ile ilgilidir ve ortak anahtar kimlik doğrulamasıyla hiçbir ilişkisi yoktur.

Ortak anahtar kimlik doğrulamasına gelince, aşağıdaki örneği düz (şifrelenmemiş) özel anahtarınızla deneyin ,


0
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("user", "hostname", 22); // default
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.setPassword("password".getBytes());
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
System.out.println("Connected");
} catch (JSchException e) {
e.printStackTrace(System.out);
} catch (Exception e) {
e.printStackTrace(System.out);
} finally {
session.disconnect();
System.out.println("Disconnected");
}
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.