web-dev-qa-db-ja.com

JSch SFTPライブラリを使用中にJava UnknownHostKeyを解決するには?

Java SFTPを使用して、あるフォルダーから別のフォルダーにファイルを転送するJavaプログラムを実行しています。私が抱えている問題は、Java SFTP(JSchを使用)で次のエラーが発生することです。

C:\ Oracle\Middleware\Oracle_Home\Oracle_common\jdk\bin\javaw.exe -server -classpath C:\ JDeveloper\mywork\Java_Hello_World.adf; C:\ JDeveloper\mywork\Java_Hello_World\Client\classes; C:\ Users\ADMIN\Downloads\jsch-0.1.53.jar -Djavax.net.ssl.trustStore = C:\ Users\IBM_AD〜1\AppData\Local\Temp\trustStore5840796204189742395.jks FileTransfer com.jcraft.jsch.JSchException:UnknownHostKey: 127.0.0.1。 RSAキーフィンガープリントは、com.jcraft.jsch.Session.checkHost(Session.Java:でa2:39:3f:44:88:e9:1f:d7:d1:71:f4:85:98:fb:90:dcです。 797)com.jcraft.jsch.Session.connect(Session.Java:342)at com.jcraft.jsch.Session.connect(Session.Java:183)at 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がセットアップされ、Cygwinが実行されていることを(netstat -a -bで)チェックしました。

13
Coffee

StrictHostKeyCheckingnoに設定して、ホストキーチェックをスキップしようとしています。

ただし、チェックの前、つまりsession.connect()の前に行う必要があります。


とにかく、セキュリティを気にしない限り、これを行うべきではありません。ホストキーチェックは、 中間者攻撃 から保護するためにあります。

代わりに、予想されるホストキーを設定して、JSchで検証できるようにします。

例えば:

  • _JSch.setKnownHosts_ _.ssh/known_hosts_- likeファイルへのパスを指定して呼び出します。

    _.ssh/known_hosts_- likeファイルを生成するには、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を使用している場合は、_ Win32-OpenSSHプロジェクト またはGit for Windowsから_ssh-keyscan_のWindowsビルドを取得できます。

  • JSch.getHostKeyRepository().add()を呼び出して、予想されるホストキーを提供します(たとえば、他の資格情報としてハードコードされています)。

    。pub形式の公開鍵からのJSch HostKeyインスタンスの作成 を参照してください。

22
Martin Prikryl

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

**私の場合、jschはknown_hostsファイルでIPアドレスを探していました

jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");
5
swaz

余談:Cygwin自体はSSHを実行しないため、「Cygwin」ではsshdまたはsftpdを意味すると仮定します。

とにかく、Jschクライアントがホストから任意のキーを受け入れるようにするには、.setConfigを設定するStrictHostKeyChecking no呼び出しを移動して、beforesession.connect()にします。または、@ Martinが説明するように、ホストの正しいキーを含むストアへのアクセスを提供する必要があります。また、「localhost」またはおそらくオンになっているマシン以外に接続する場合は、常にそれを行う必要があります。同じ物理的に安全なネットワークセグメント(単一の部屋内の有線LANハブなど)。

3