如何在使用JSch SFTP库的同时解析Java UnknownHostKey?

2022-09-02 05:18:39

我正在运行一个java程序,我使用Java SFTP将文件从一个文件夹传输到另一个文件夹。我遇到的问题是,我在Java SFTP(使用JSch)中收到以下错误:

C:\Oracle\Middleware\Oracle_Home\oracle_common\jdk\bin\javaw.exe -server -classpath C:\JDeveloper\mywork\Java_Hello_World.adf;C:\JDeveloper\mywork\Java_Hello_World\Client\classes;C:\Users\ADMIN\Downloads\jsch-0.1.53.jar -Djavax.net.ssl.trustStore=C:\Users\IBM_AD~1\AppData\Local\Temp\trustStore5840796204189742395.jks FileTransfer com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1.RSA 密钥指纹是 a2:39:3f:44:88:e9:1f:d7:d1:71:f4:85:98:fb:90:dc at com.jcraft.jsch.session.checkHost(Session.java:797) at com.jcraft.jsch.Session.connect(Session.java:342) at com.jcraft.jsch.Session.connect(Session.java:183) at FileTransfer.main(FileTransfer.java:33) 进程退出,退出代码为 0。

以下是我到目前为止的代码:

FileTransfer fileTransfer = new FileTransfer();              

JSch jsch = new JSch();

try {

    String host = "127.0.0.1";
    int port = 22;

    String user = "user";
    Session session = jsch.getSession(user, host, port);      
    session = jsch.getSession("username", "127.0.0.1", 22);
    session.connect();  // bug here , java.net.ConnectException

    ChannelSftp sftp = null;
    sftp = (ChannelSftp)session.openChannel("sftp") ; //channel;

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

    sftp.rename("C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp", "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp");  
    session.disconnect();

} catch (JSchException e) {
    e.printStackTrace();  
} catch (SftpException e) {
    e.printStackTrace();
} //end-catch

我的Cygwin已经设置好了,我检查(用)它正在运行。netstat -a -b


答案 1

您正在尝试通过设置为 跳过主机密钥检查。StrictHostKeyCheckingno

但是您必须在检查之前执行此操作,即在 .session.connect()


无论如何,除非您不关心安全性,否则您永远不应该这样做。主机密钥检查是为了保护您免受中间人攻击

相反,请设置预期的主机密钥,让 JSch 对其进行验证。

例如:

  • 调用 JSch.setKnownHosts,提供类似文件的路径。.ssh/known_hosts

    要生成类似 -like 的文件,可以使用 OpenSSH 中的命令。如果您从 *nix 服务器进行连接,则应该有可用的命令,只需运行.ssh/known_hostsssh-keyscan

    ssh-keyscan example.com > known_hosts
    

    它将具有如下格式:

    example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ==
    

    并在 JSch 代码中引用生成的文件。known_hosts

    如果您使用的是Windows,则可以从Win32-OpenSSH项目或Git for Windows获得Windows版本。ssh-keyscan

  • 调用以提供预期的主机密钥(例如,硬编码,作为您的其他凭据)。JSch.getHostKeyRepository().add()

    请参见从 .pub 格式的公钥创建 JSch HostKey 实例


答案 2

jsch 版本 : 0.1.55

我的问题通过运行来解决:

ssh-keyscan -t rsa <HOST_NAME> >> ~/.ssh/known_hosts
ssh-keyscan -t rsa <IP_ADDRESS_OF_HOST_NAME> >> ~/.ssh/known_hosts

**在我的情况下,jsch known_hosts文件中寻找IP地址

jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");

推荐