JSchException: UnknownHostKey

Я пытаюсь использовать Jsch для установления SSH-соединения в Java. Я установил "StrictHostKeyChecking" на "да". Я понимаю, что ключ хоста сервера должен быть получен заранее и сохранен в файле ключа хоста перед первой попыткой подключения к серверу. Как я могу получить HostKey сервера. Мой код вызывает следующее исключение:

com.jcraft.jsch.JSchException: UnknownHostKey: ASY-PC Отпечаток ключа RSA: 22: fb: ee: fe: 18: cd: aa: 9a: 9c: 78: 89: 9f: b4: 78: 75: b4

Как я могу подключиться к StrictHostKeyChecking Да. Вот мой код.

package sshexample;

import com.jcraft.jsch.*;
import java.io.*;

public class SSHexample 
{
public static void main(String[] args) 
{
    String user = "user";
    String password = "password";
    String host = "192.168.100.103";
    int port=22;
    try
    {
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "yes");
        System.out.println("Establishing Connection...");
        session.connect();
        System.out.println("Connection established.");
        System.out.println("Crating SFTP Channel.");
        ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
        sftpChannel.connect();
}catch(Exception e) {
e.printStackTrace();
}
}

person Atul Singh Yadav    schedule 28.09.2013    source источник
comment
Я думаю, что это широко обсуждается и уже даны ответы с возможными решениями в stackoverflow .com / questions / 2003419 /?   -  person uiron    schedule 28.09.2013
comment
Спасибо за ответ .. Но нет никакого решения для подключения с помощью StrictHostKeyChecking. Да ... Я хочу установить соединение с проверкой ключа хоста ..   -  person Atul Singh Yadav    schedule 28.09.2013
comment
проверьте комментарии, отличные от принятых, он расскажет вам, как установить файл известных хостов.   -  person uiron    schedule 17.10.2013


Ответы (4)


Вы должны предоставить файл KnownHostKeys, вызвав следующую функцию

jsch.setKnownHosts(new FileInputStream(knownHostsFile));

в этом файле должны быть отпечатки всех известных хостов, разделенные новыми строками.

Например

hostname,10.1.1.120, ssh-rsa AAAAC3NzaC1yc2EAAAADAQABAAABAQCi5b647581SwC0uUDQw1ENjKSz3rhJMRRZEgIjHylvF4fbuAEzj645YoAf9SItb51MhetFAJrq98jYsHpedSm3IoMG+aR/P1CjsBz1RtJKlfR2NfYDCZ7Dyx11P8FnJbwbYif/GeG0xEujekwF1pyL0tNPmf0H4/GPR4mwrv/llGlB3Lo3BzxrGtl4f4X/oSHDoo7FrQkDwqOfeSM++3vPPHxyVO5zhFJ5u9f7M/uuxUeHS+YS5JWAI7NLXKgbiM9dluGzZU/6Awo3ux4x5ojL+kf29JEVxK+o6GfW2bIW+LhgIGZNThnN5nHzBVfNNHvQ7KC5ic0h2z2gbVpwJr1h

вы можете получить этот ключ с сервера, используя любой клиент sftp, однако следующая команда может помочь, если вы используете linux или unix

ssh-keyscan -t rsa 10.1.1.120
person Mubashar    schedule 29.05.2014
comment
Спасибо за адрес - ssh-keyscan -t rsa. - person hipokito; 10.11.2016

После нескольких минут тестирования я нашел решение для этого. Если вы не хотите использовать файл knownHost по умолчанию, просто создайте свой собственный

Вот как мог бы выглядеть файл:

192.168.0.1 ssh-rsa
AAAAC3NzaC1yc2EAAAADAQABAAABAQCi5b647581SwC0uUDQw1ENjKSz3rhJMRRZEgIjHylvF4fbuAEzj645YoAf9SI
tb51MhetFAJrq98jYsHpedSm3IoMG+aR/P1CjsBz1RtJKlfR2NfYDCZ7Dyx11P8FnJbwbYif
/GeG0xEujekwF1pyL0tNPmf0H4/GPR4mwrv/llGlB3Lo3BzxrGtl4f4X
/oSHDoo7FrQkDwqOfeSM++3vPPHxyVO5zhFJ5u9f7M/uuxUeHS+YS5JWAI7NLXKgbiM9dluGzZU
/6Awo3ux4x5ojL+kf29JEVxK+o6GfW2bIW+LhgIGZNThnN5nHzBVfNNHvQ7KC5ic0h2z2gbVpwJr1h

И все эти записи разделяются новыми строками. Вы получите ключ RSA, который хотите, задав свой сеанс:

session=null;
com.jcraft.jsch.Channel channel =null;
try{
    ssh=new JSch();
    ssh.setKnownHosts("test");
    session=ssh.getSession(userTextField.getText(),ip,22);
    session.setPassword(passwordField1.getText());

    System.out.println(session.getHostKey());
    session.connect();
    channel=session.openChannel("sftp");
    channel.connect();
    ChannelSftp sftp=(ChannelSftp) channel;
    System.out.println(sftp.getHome());
    for (Object o : sftp.ls(sftp.getHome())) {
        System.out.println(((ChannelSftp.LsEntry)o).getFilename());
    }

    } catch (JSchException e1) {
        e1.printStackTrace();
        addHost(session.getHostKey().getKey());
    } catch (SftpException e1) {
        e1.printStackTrace();
    }
}

private void addHost(String key){
    try {
        FileWriter tmpwriter=new FileWriter("test",true);

            tmpwriter.append(ip + " ssh-rsa " + key+"\n");
            System.out.println(ip + " ssh-rsa " + key);

        tmpwriter.flush();
        tmpwriter.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Итак, session.getHostKey().getKey() - это то, что вы хотите вызвать, чтобы получить ключ.

Вам также нужно позвонить session.connect();, прежде чем вы попросите ключ и обработаете его в ловушке.

person nothing to know    schedule 15.07.2014
comment
Какая вторая строка в хост-файле? Как это происходит? - person Reimius; 12.02.2015
comment
@Reimius достать очень просто. Я упомянул об этом в своем ответе ниже - stackoverflow.com/questions/19063115/ < / а> - person Aniket Thakur; 21.07.2015

Поскольку большинство ответов предполагает, что вы должны предоставить файл хоста, но не указать, как его получить. Вам просто нужно подключиться к хосту по SSH.

Eg ssh [email protected]

при появлении запроса введите пароль. При первом подключении вы сохраните отпечаток ключа ssh хоста. После подключения вы можете найти свой файл known_host по адресу

user/.ssh/known_hosts

Для меня путь в Windows - C:\Users\athakur\.ssh\known_hosts. Вы можете напрямую использовать этот файл. Или отредактируйте файл и выберите из него запись, соответствующую вашему IP-адресу, которая будет выглядеть примерно так:

192.168.100.103 SSH-RSA AAAAB3NzaC1yc2EAAAABIwAAAQEA1UsgiLH5hjIScZlqPA4kNhPoXAX00mMv65N8qTvYd1D1M5DwWtTTcxK4w0wGKKVA7RERzWbtjPpSomJwT1LofZr + qafLdiEvhirIXVYHSWZqp6zTJW0jzk3p07ugjoHV3YUWKDzOaiFuOMslt8hD7pZv8nhOYfxBZdsVHdukYRP8MADXC0ZgOD5ZYZ0EglaQJYPG7n73PSMZWZT / oafUcx6bFiRF4QsXaguWuu6umX9gaV7VvoyMJg + kxPAKnGDFY7If61AG7vAchUUhlQ44SB1FFr25y + qeUg2NGqAxH / Z / ZAfvZ + pDv3Cd9s + KCnEIqxyxY / sPQ2zCvwf0Z9fTeQ ==

Примечание. Отпечаток SSH хост-машины (на основе открытого ключа хоста, который вы можете найти в /etc/ssh/ssh_host_rsa_key.pub) может измениться, если SSH переустановлен на этом компьютере. Или вы можете столкнуться с атакой MIM (даже для тестирования). В таких случаях вам нужно будет выбрать новую запись таким же образом, как описано выше.

person Aniket Thakur    schedule 21.07.2015
comment
лучше, если вы просто используете этот ssh-keyscan -t rsa 10.1.1.120 - person Mubashar; 29.05.2020

Возможно, это уже не актуально, но в моем случае аналогичная проблема возникла с docker-compose.yml в контейнере, который был построен из приложения spring -boot, которое на 100% работало локально.

config-service:
    image: <host>/<bla>-config-service:<version>
    hostname: config-service
    ports:
        - 3000:3000
    depends_on:
        - discovery
    environment:
        - CONSUL_HOST=discovery
        - CONSUL_PORT=<port> 
        - CONFIG_GIT_URI=git@<host>:<group>/<repository>.git
        - CONFIG_GIT_BRANCH=development
    volumes:
        - ~/.ssh/:/root/.ssh/:ro

Решением было применить взлом к ​​папке ~ / .ssh.

chcon -Rt svirt_sandbox_file_t ~/.ssh

После этого, я полагаю, тома были правильно сопоставлены между контейнером докеров и локальным компьютером, и описанное исключение исчезло.

person sandarovich    schedule 06.02.2018