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

时间:2015-09-29 20:10:17

标签: java ssh sftp jsch public-key

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

  

C:\甲骨文\中间件\ 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:\用户\ IBM_AD〜1个\应用程序数据\本地\ 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     在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)它正在运行。

3 个答案:

答案 0 :(得分:20)

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

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

无论如何,除非你不关心安全,否则你不应该这样做。主机密钥检查可以保护您免受man-in-the-middle attacks

的影响

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

例如:

  • 致电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 project或Git for Windows获得ssh-keyscan的Windows版本。

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

    请参阅Creating JSch HostKey instance from a public key in .pub format

答案 1 :(得分:4)

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");

答案 2 :(得分:2)

除此之外:通过“Cygwin”我认为你的意思是sshd或sftpd,因为Cygwin本身不会做SSH。

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