Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSCHEException:UnknownHostKey_Java_Ssh_Jsch - Fatal编程技术网

Java JSCHEException:UnknownHostKey

Java JSCHEException:UnknownHostKey,java,ssh,jsch,Java,Ssh,Jsch,我正在尝试使用Jsch在Java中建立SSH连接。 我已将“KeyChecking”设置为是。我知道服务器的主机密钥必须事先获得并存储在主机密钥文件中 在第一次尝试连接到服务器之前。如何获取服务器的主机密钥。我的代码生成以下异常: 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建

我正在尝试使用Jsch在Java中建立SSH连接。 我已将“KeyChecking”设置为是。我知道服务器的主机密钥必须事先获得并存储在主机密钥文件中 在第一次尝试连接到服务器之前。如何获取服务器的主机密钥。我的代码生成以下异常:

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

您必须通过调用以下函数来提供KnownHostKeys文件

jsch.setKnownHosts(新文件输入流(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

经过几分钟的测试,我找到了解决方案。如果不想使用默认的
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();
    }
}

因此,要调用
session.getHostKey().getKey()
来获取密钥


您还需要调用
session.connect()在您请求密钥并在catch中处理它之前。

因为大多数答案表明您必须提供已知主机文件,但无法解决如何获取它。您只需要SSH到主机

例如
sshuser@192.168.100.103

出现提示时,请提供密码。对于第一次连接,您需要保存主机ssh密钥指纹。连接后,您可以在以下位置找到已知的\u主机文件:

user/.ssh/known_hosts
对于我来说,windows路径是
C:\Users\athakur\.ssh\known\u hosts
。您可以直接使用此文件。或者编辑文件并从中提取与您的IP地址对应的条目

192.168.100.103 ssh rsa一个2岁的研究者在一个2岁的研究中发现了一个2岁的2岁的2岁的2岁的一个2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2 Z/ZAfvZ+pDv3Cd9s+KCnEIqxyxY/sPQ2zCvwf0Z9fTeQ==


注意:主机SSH指纹(基于主机公钥,您可以在
/etc/SSH/SSH\u Host\u rsa\u key.pub
)中找到)可能会在SSH中发生更改,然后在该计算机中重新安装。或者您可能会遇到MIM攻击(即使是为了测试)。在这种情况下,您必须以上述相同的方式选择新条目

也许这与此无关,但在我的例子中,容器中的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

之后,我假设卷在docker容器和本地机器之间正确映射,并且描述的异常已消失。

我认为它已被广泛讨论,并已在?Thanx中回答了可能的解决方案,以供答复。。但没有任何解决方案可用于使用StrictHostKeyChecking进行连接是的…我想使用check Host key进行连接。。检查除已接受之外的注释,它告诉您如何设置已知主机文件。主机文件中的第二行是什么?它是如何产生的?@Reimius得到它很简单。我在下面的回答中提到了它-感谢您提供了-ssh-keyscan-t rsa地址。如果您只使用这个ssh-keyscan-t rsa 10.1.1.120,效果会更好
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
chcon -Rt svirt_sandbox_file_t ~/.ssh