问题
我正在尝试使用Jsch在Java中建立SSH连接。我的代码产生以下异常:
com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.com.
RSA key fingerprint is 22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4
我找不到如何在Jsch文档中验证主机密钥。我在下面提供了我的代码。
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class ssh {
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
//create SSH connection
String host = "mywebsite.com";
String user = "username";
String password = "123456";
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
session.connect();
} catch(Exception e) {
System.out.println(e);
}
}
}
#1 热门回答(179 赞)
我要么:
- 尝试从命令行ssh并接受公钥(主机将被添加到〜/ .ssh / known_hosts,然后一切都应该从Jsch正常工作) - 或 -
- 使用以下代码将JSch配置为不使用"StrictHostKeyChecking"(这会引入不安全因素并且只应用于测试目的):java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking","no");
session.setConfig(配置);
选项#1(将主机添加到299985075文件)有我的偏好。
#2 热门回答(23 赞)
避免主机密钥检查是一种安全风险。
JSch使用HostKeyRepository接口及其默认实现KnownHosts类来管理它。你可以通过实现HostKeyRepository来提供允许特定键的备用实现。或者,你可以在known_hosts format中保留要允许的密钥并调用
jsch.setKnownHosts(knownHostsFileName);
或者使用如下的公钥String。
String knownHostPublicKey = "mysite.com ecdsa-sha2-nistp256 AAAAE............/3vplY";
jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));
有关详细信息,请参阅Javadoc。
这将是一个更安全的解决方案。
Jsch是开源的,你可以从here下载源代码。在示例文件夹中,查找KnownHosts.java以了解更多详细信息。
#3 热门回答(17 赞)
虽然这个问题已经得到了解答,但我发现自己有一个acase,即使现有的known_hostsentry也无济于事。当SSH服务器发送ECDSA指纹时会发生这种情况,因此,你将拥有如下条目:
|1|+HASH=|HASH= ecdsa-sha2-nistp256 FINGERPRINT=
问题是JSch更喜欢SHA_RSA,连接时会尝试比较SHA-RSA指纹,这将导致"未知主机"错误。
要解决此问题,请运行:
$ ssh-keyscan -H -t rsa example.org >> known_hosts
或抱怨Jcraft更喜欢使用SHA_RSA而不是使用localHostKeyAlgorithmssetting,尽管他们似乎并没有太多来修复他们的bugs。