【问题标题】:"JSchException: reject HostKey" when connecting to SSH server from Java using JSch使用 JSch 从 Java 连接到 SSH 服务器时出现“JSchException:拒绝 HostKey”
【发布时间】:2020-04-23 11:19:54
【问题描述】:

我尝试根据说明在我的 Java 程序中使用 SSH 在 PythonAnywhere 中建立与 MySQL 基础的连接:
https://help.pythonanywhere.com/pages/AccessingMySQLFromOutsidePythonAnywhere

不幸的是,我每次都收到这个错误,而且我的想法已经用完了:

com.jcraft.jsch.JSchException: 拒绝 HostKey: ssh.pythonanywhere.com

public static void main(String[] args) {
    Tunnel tunnel = new Tunnel();
    try {
        tunnel.go();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void go() throws Exception {
    String host = "ssh.pythonanywhere.com";
    String user = "username";
    String password = "password";
    int port = 22;

    int tunnelLocalPort = 9080;
    String tunnelRemoteHost = "username.mysql.pythonanywhere-services.com";
    int tunnelRemotePort = 3306;

    JSch jsch= new JSch();
    Session session = jsch.getSession(user,host,port);
    localUserInfo lui = new localUserInfo();
    session.setPassword(password);
    session.setUserInfo(lui);
    session.connect();
    session.setPortForwardingL(tunnelLocalPort,tunnelRemoteHost,tunnelRemotePort);
    System.out.println("Connecting");
}

class localUserInfo implements UserInfo {
    String passwd;

    @Override
    public String getPassphrase() {return null; }

    @Override
    public String getPassword() { return null; }

    @Override
    public boolean promptPassword(String s) { return false; }

    @Override
    public boolean promptPassphrase(String s) { return false; }

    @Override
    public boolean promptYesNo(String s) { return false; }

    @Override
    public void showMessage(String s) {}
}

我使用 PuTTY 成功连接,但无法让我的程序运行。

【问题讨论】:

    标签: java ssh jsch pythonanywhere ssh-tunnel


    【解决方案1】:

    好的,

    好像加了:

    java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    

    帮助解决了异常。

    【讨论】:

    • 这不是正确的方法。通过设置StrictHostKeyChecking=no,您将失去对MITM attacks 的保护
    【解决方案2】:

    JSch 无法验证 SSH 服务器主机密钥。

    • 您的主机密钥存储库包含不同的主机密钥。

    • 或者 JSch 尝试通过调用 UserInfo.promptYesNo 来提示用户手动验证主机密钥。当您的实现返回 false 时,主机密钥被拒绝。


    有关验证主机密钥的正确方法,请参阅:
    How to resolve Java UnknownHostKey, while using JSch SFTP library?


    请注意,即使在 PuTTY 中,您也必须在第一次连接时验证主机密钥。

    【讨论】:

      【解决方案3】:

      启动您的应用程序一次

      sftp.strictHostKeyChecking=no
      

      这将在known_hosts中添加密钥,之后您可以将其切换回yes

      【讨论】:

        【解决方案4】:

        FWIW,在我的情况下,使用 jsch 以编程方式 ssh 到另一台机器,即使我使用的是用户名/密码凭据,我也必须通过手动 ssh 用户名/pw 登录添加两个密钥(类型 ecdsa-sha2 -nistp256),以及在使用基于 rsa 密钥的登录时添加的一个(类型 ssh-rsa)。

        【讨论】:

          猜你喜欢
          • 2018-07-02
          • 1970-01-01
          • 2016-11-28
          • 2021-01-17
          • 1970-01-01
          • 2018-08-07
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          相关资源
          最近更新 更多