كيفية حل Java UnknownHostKey ، أثناء استخدام مكتبة JSch SFTP؟




ssh public-key (2)

إصدار 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 يبحث عن عنوان IP في ملف known_hosts

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

أقوم بتشغيل برنامج java حيث أقوم بنقل ملف من مجلد إلى آخر ، باستخدام Java SFTP. المشكلة التي أواجهها هي أنني أتلقى الخطأ التالي في 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 هي a2: 39: 3f: 44: 88: e9: 1f: d7: d1: 71: f4: 85: 98: fb: 90: dc على com.jcraft.jsch.Session.checkHost (Session.java: 797) على com.jcraft.jsch.Session.connect (Session.java:342) على com.jcraft.jsch.Session.connect (Session.java:183) في 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 الخاص بي ، وتحققت (مع netstat -a -b ) من أنه يعمل.


تحاول تخطي التحقق من مفتاح المضيف عن طريق تعيين StrictHostKeyChecking إلى no .

ولكن عليك القيام بذلك قبل التدقيق ، أي قبل الجلسة. session.connect() .

على أي حال ، يجب ألا تفعل هذا أبدًا ، إلا إذا كنت لا تهتم بالأمان. التحقق من مفتاح المضيف موجود لحمايتك من هجمات الرجل المتوسط .

بدلاً من ذلك ، قم بإعداد مفتاح مضيف متوقع للسماح لـ JSch بالتحقق منه.

فمثلا:

  • استدعاء JSch.setKnownHosts توفير مسار إلى ملف .ssh/known_hosts مثل.

    لإنشاء ملف .ssh/known_hosts ، يمكنك استخدام أمر ssh-keyscan من OpenSSH. إذا كنت تتصل من خادم * nix ، فيجب أن يكون لديك الأمر المتاح ، فقط قم بتشغيله

    ssh-keyscan example.com > known_hosts

    سيكون له تنسيق مثل:

    example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ==

    والرجوع إلى ملف known_hosts إنشاؤه في كود JSch الخاص بك.

    إذا كنت تستخدم نظام التشغيل Windows ، فيمكنك الحصول على إصدار Windows من ssh-keyscan من مشروع Win32-OpenSSH أو Git for Windows.

  • اتصل بـ JSch.getHostKeyRepository().add() لتوفير مفتاح المضيف المتوقع (مثل الترميز الثابت ، JSch.getHostKeyRepository().add() اعتمادك الأخرى).

    راجع إنشاء مثيل JSch HostKey من مفتاح عمومي بتنسيق .pub .





public-key