簡體   English   中英

使用 JSch 從 Java 連接到 SSH 服務器時出現“JSchException:reject HostKey”

[英]"JSchException: reject HostKey" when connecting to SSH server from Java using JSch

我嘗試根據說明在我的 Java 程序中使用 SSH 在 PythonAnywhere 中建立與 MySQL 基礎的連接:
https://help.pythonanywhere.com/pages/AccessingMySQLFromOutsidePythonAnywhere

不幸的是,我每次都會遇到這個錯誤,而且我的想法已經用完了:

com.jcraft.jsch.JSchException:拒絕主機密鑰: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 成功連接,但無法讓我的程序運行。

JSch 無法驗證 SSH 服務器主機密鑰。

  • 您的主機密鑰存儲庫包含不同的主機密鑰。

  • 或者 JSch 嘗試通過調用UserInfo.promptYesNo提示用戶手動驗證主機密鑰。 當您的實現返回false ,主機密鑰被拒絕。


有關驗證主機密鑰的正確方法,請參閱:
使用 JSch SFTP 庫時如何解析 Java UnknownHostKey?


請注意,即使在 PuTTY 中,您也必須在第一次連接時驗證主機密鑰。

好的,

似乎添加:

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

幫助解決異常。

FWIW,在我的情況下,使用 jsch 以編程方式 ssh 到另一台機器,即使我使用的是用戶名/密碼憑據,我也必須通過手動 ssh 用戶名/密碼登錄(類型 ecdsa-sha2-nistp256)添加兩個密鑰,以及在使用基於 rsa 密鑰的登錄(鍵入 ssh-rsa)時添加的那個。

啟動您的應用程序一次

sftp.strictHostKeyChecking=no

這將在known_hosts中添加密鑰,之后您可以將其切換回yes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM