2

我正在尝试使用 Jsch 在 Java 中建立 SSH 连接。我已将“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 建立连接 Yes。这是我的代码。

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

4 回答 4

10

您必须通过调用以下函数来提供 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
于 2014-05-29T02:20:25.743 回答
2

经过几分钟的测试,我找到了解决方案。如果您不想使用默认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();,然后再索要钥匙并抓住钥匙。

于 2014-07-15T20:36:13.000 回答
2

由于大多数答案都建议您必须提供已知的主机文件,但无法解决如何获取它。您只需要通过 SSH 连接到主机。

例如ssh user@192.168.100.103

提示时提供密码。对于第一次连接,您将保存主机 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 攻击(即使是为了测试)。在这种情况下,您必须以上述相同的方式选择新条目。

于 2015-07-21T15:54:15.000 回答
1

也许它不再相关,但在我的情况下,容器中的 docker-compose.yml 发生了类似的问题,它是从 100% 在本地工作的 spring-boot 应用程序构建的

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 文件夹应用 hack。

chcon -Rt svirt_sandbox_file_t ~/.ssh

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

于 2018-02-06T12:42:04.290 回答