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
如何在使用JSch SFTP库时解析Java UnknownHostKey?_Java_Ssh_Sftp_Jsch_Public Key - Fatal编程技术网

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

如何在使用JSch SFTP库时解析Java UnknownHostKey?,java,ssh,sftp,jsch,public-key,Java,Ssh,Sftp,Jsch,Public Key,我正在运行一个java程序,使用java SFTP将文件从一个文件夹传输到另一个文件夹。我遇到的问题是,我的Java SFTP(使用JSch)中出现以下错误: C:\Oracle\Middleware\Oracle\u Home\Oracle\u common\jdk\bin\javaw.exe -服务器-类路径C:\JDeveloper\mywork\Java\u Hello\u World.adf;C:\JDeveloper\mywork\Java\u Hello\u World\Clien

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

C:\Oracle\Middleware\Oracle\u Home\Oracle\u common\jdk\bin\javaw.exe -服务器-类路径C:\JDeveloper\mywork\Java\u Hello\u World.adf;C:\JDeveloper\mywork\Java\u Hello\u World\Client\classes;C:\Users\ADMIN\Downloads\jsch-0.1.53.jar -Djavax.net.ssl.trustStore=C:\Users\IBM\u 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 位于com.jcraft.jsch.Session.checkHost(Session.java:797) com.jcraft.jsch.Session.connect(Session.java:342)位于 com.jcraft.jsch.Session.connect(Session.java:183)位于 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
)检查了它是否正在运行。

旁白:“Cygwin”我想你指的是sshd或sftpd,因为Cygwin本身不做SSH


无论如何,如果您想让Jsch客户端接受来自主机的任何密钥,请将
.setConfig
调用移动到
strichHostKeyChecking no
之前,使其处于状态。或者,正如@Martin所解释的,您必须提供对包含主机正确密钥的存储的访问权限,并且在连接到除“localhost”以外的任何设备或可能位于同一物理安全网段(例如单个房间内的有线LAN集线器)上的机器时,您应该始终这样做.

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

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


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

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

例如:

  • 调用提供类似
    .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上,您可以从或Git for Windows获得
    ssh keyscan
    的Windows版本

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

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

“您必须”:请不要建议任何人不验证SSH主机密钥。至少不能不解释后果。这是一个可怕的安全错误。顺便问一下,什么是sftpd?@Coffee我的意思是“任何专门实现sftp的服务器(在Unix中通常是something-d),但不是ssh的其余部分”。对于Linux,通常(并非总是)是vsftpd,但我不知道cygwin的情况。我可能应该说“一个sftp服务器”。@dave_thompson_085对于Linux,它是OpenSSH,而不是vsftpd。Cygwin也是如此。在~/.ssh/known_主机文件中添加适当的主机密钥解决了这个问题,感谢您的前两行评论!Jsch不会附加该文件,您必须手动执行该操作。这就是路!
jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");