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

我正在运行一个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 )它正在运行。

您试图通过将StrictHostKeyChecking设置为no来跳过主机密钥检查。

但是你必须在检查之前,即在session.connect()之前这样做。


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

相反,设置一个预期的主机密钥让JSchvalidation它。

例如:

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

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

     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实例 。

旁白:通过“Cygwin”我假设你的意思是sshd或sftpd,因为Cygwin本身不会做SSH。

无论如何,如果您希望Jsch客户端接受来自主机的任何密钥,请移动设置StrictHostKeyChecking no.setConfig调用,使其 session.connect() 之前 。 或者,您必须提供对包含主机正确密钥的商店的访问权限,如@Martin所解释的那样 – 当您连接到“localhost”以外的任何其他设备或者可能是某台机器时,您应该始终这样做相同的物理安全网段(例如单个房间内的有线LAN集线器)。