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
で)チェックしました。
StrictHostKeyChecking
をno
に設定して、ホストキーチェックをスキップしようとしています。
ただし、チェックの前、つまり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インスタンスの作成 を参照してください。
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");
余談:Cygwin自体はSSHを実行しないため、「Cygwin」ではsshdまたはsftpdを意味すると仮定します。
とにかく、Jschクライアントがホストから任意のキーを受け入れるようにするには、.setConfig
を設定するStrictHostKeyChecking no
呼び出しを移動して、beforesession.connect()
にします。または、@ Martinが説明するように、ホストの正しいキーを含むストアへのアクセスを提供する必要があります。また、「localhost」またはおそらくオンになっているマシン以外に接続する場合は、常にそれを行う必要があります。同じ物理的に安全なネットワークセグメント(単一の部屋内の有線LANハブなど)。