如何在使用JSch SFTP库时解析Java UnknownHostKey?
我正在运行一个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 以下是我目前的代码:如何在使用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
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所解释的,您必须提供对包含主机正确密钥的存储的访问权限,并且在连接到除“本地主机”以外的任何设备或可能位于同一物理安全网段(例如单个房间内的有线LAN集线器)上的机器时,您应该始终这样做“Cygwin”我想你指的是sshd或sftpd,因为Cygwin本身不做SSH
无论如何,如果您希望Jsch客户端接受来自主机的任何密钥,请将设置StricHostKeyChecking no的
.setConfig
调用移动到会话之前。connect()。或者,您必须提供对包含主机正确密钥的存储的访问权限正如@Martin所解释的——当连接到“本地主机”以外的任何设备或可能位于同一物理安全网段(例如单个房间内的有线LAN集线器)上的机器时,您应该始终这样做.您正试图通过将StrictHostKeyChecking
设置为no
来跳过主机密钥检查
但您必须在检查之前执行此操作,即在会话.connect()
之前
无论如何,你永远不应该这样做,除非你不关心安全性。主机密钥检查是为了保护你不受攻击 相反,设置一个期望的主机密钥,让JSch验证它 例如:
- 调用提供类似
的文件的路径 要生成类似.ssh/known_hosts
-的文件,您可以使用OpenSSH中的.ssh/known_hosts
命令。如果您是从*nix服务器连接的,您应该有可用的命令,只需运行ssh keyscan
其格式如下:ssh-keyscan example.com > known_hosts
并在JSch代码中引用生成的example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ==
文件 如果您在Windows上,您可以从或Git for Windows获得known_hosts
的Windows版本ssh keyscan
- 调用
,以提供预期的主机密钥(例如,硬编码,作为您的其他凭据) 看JSch.getHostKeyRepository().add()
StrictHostKeyChecking
设置为no
来跳过主机密钥检查
但您必须在检查之前执行此操作,即在会话.connect()
之前
无论如何,你永远不应该这样做,除非你不关心安全性。主机密钥检查是为了保护你不受攻击 相反,设置一个期望的主机密钥,让JSch验证它 例如:
- 调用提供类似
的文件的路径 要生成类似.ssh/known_hosts
-的文件,您可以使用OpenSSH中的.ssh/known_hosts
命令。如果您是从*nix服务器连接的,您应该有可用的命令,只需运行ssh keyscan
其格式如下:ssh-keyscan example.com > known_hosts
并在JSch代码中引用生成的example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ==
文件 如果您在Windows上,您可以从或Git for Windows获得known_hosts
的Windows版本ssh keyscan
- 调用
,以提供预期的主机密钥(例如,硬编码,作为您的其他凭据) 看JSch.getHostKeyRepository().add()
ssh-keyscan -t rsa <HOST_NAME> >> ~/.ssh/known_hosts
ssh-keyscan -t rsa <IP_ADDRESS_OF_HOST_NAME> >> ~/.ssh/known_hosts
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我的意思是“任何服务器(在Unix中通常是something-d)专门实现sftp,但不是SSH的其余部分”。对于Linux来说,这通常是(不总是)vsftpd,但我不知道cygwin。我可能应该说“一个sftp服务器”。@dave_thompson_085对于Linux,它是OpenSSH,而不是vsftpd。cygwin也是如此。“你必须“:请不要建议任何人不验证SSH主机密钥。至少不能不解释后果。这是一个可怕的安全错误。顺便问一下,什么是sftpd?@Coffee我的意思是“任何专门实现sftp的服务器(在Unix中通常是something-d),但不是ssh的其余部分”。对于Linux,通常(并非总是)是vsftpd,但我不知道cygwin的情况。我可能应该说“一个sftp服务器”。@dave_thompson_085对于Linux,它是OpenSSH,而不是vsftpd。Cygwin也是如此。在~/.ssh/known_主机文件中添加适当的主机密钥解决了这个问题,感谢您的前两行评论!Jsch不会附加