com.jraft.jsch.JSchException: অজানাহোস্টকে


179

আমি জাভাতে এসএসএইচ সংযোগ স্থাপনের জন্য জেসচ ব্যবহার করার চেষ্টা করছি । আমার কোড নিম্নলিখিত ব্যতিক্রম উত্পাদন করে:

com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.com. 
RSA key fingerprint is 22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4

জেএসসি ডকুমেন্টেশনে হোস্ট কী কীভাবে যাচাই করা যায় তা খুঁজে পাচ্ছি না। আমি আমার কোডটি নীচে অন্তর্ভুক্ত করেছি।

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class ssh {
    public static void main(String[] arg) {

        try {
            JSch jsch = new JSch();

            //create SSH connection
            String host = "mywebsite.com";
            String user = "username";
            String password = "123456";

            Session session = jsch.getSession(user, host, 22);
            session.setPassword(password);
            session.connect();

        } catch(Exception e) {
            System.out.println(e);
        } 
    }
}

আপনার * নিক্স হোস্টে এসএসডিডি বন্ধ করার চেষ্টা করুন, এবং অগ্রভাগে একক থ্রেড শুরু করুন: / usr / sbin / sshd -d এটি আপনাকে এসএসডি পাশ থেকে প্রচুর ডিবাগিং তথ্য দেবে।

@ আমসোকুন প্রত্যেকেই এই সমস্যাটি সমাধান করতে সক্ষম হয়েছে। উত্তর দেখুন।
bmargulies

উত্তর:


226

আমি হয়:

  1. sshকমান্ড লাইন থেকে চেষ্টা করুন এবং সর্বজনীন কীটি গ্রহণ করুন ( ~/.ssh/known_hostsহোস্টটিতে যোগ করা হবে এবং তারপরে Jsch থেকে সব কিছু ঠিকঠাক কাজ করা উচিত) -আর-
  2. নীচের কোডটি ব্যবহার করে "স্ট্রাইকটহস্টকিচেকিং" ব্যবহার না করার জন্য জেএসচকে কনফিগার করুন (এটি নিরাপত্তাহীনতার পরিচয় দেয় এবং কেবল এটি পরীক্ষার উদ্দেশ্যে ব্যবহার করা উচিত):

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

বিকল্প # 1 ( ~/.ssh/known_hostsফাইলটিতে হোস্ট যুক্ত করা ) আমার পছন্দ রয়েছে।


37
JSch#setConfig("StrictHostKeyChecking", "no")একই কাজটি করবে, তবে কেবল একটি লাইনে
yegor256

2
পার্শ্ব দ্রষ্টব্য: ~/.ssh/configউত্স কোডটি সংশোধন করার অ্যাক্সেস আমার কাছে নেই তখন উপরের ত্রুটিটি ঠিক করতে আমার ফাইলটি কনফিগার করতে আমি এই প্রতিক্রিয়াটি ব্যবহার করেছি
অ্যাডাম রফার

আপনি আপনার .ssh / কনফিগারেশনে কী করেছেন? আমি একই ত্রুটি করছি।
বার্নার্ড ইগিরি

19
এটি অনিরাপদ এবং সত্যই এই নীতির সঠিক উত্তর হিসাবে নির্বাচিত হওয়া উচিত ছিল না। সেটকোনোডহোস্টস () এবং সেটফিংগার মুদ্রণ () বিকল্পগুলি এসএসএস প্রক্রিয়ার কোনও গুরুত্বপূর্ণ দিক উপেক্ষা না করে এটি করার উপায়। সম্পাদনা করুন: আমার অভিজ্ঞতায়, # 1 কিছু আইডিই পরিবেশের মতো থেকে কাজ করে না।
রন্ডো

1
এটি গ্রহনের অভ্যন্তরে আমার জন্য কাজটি করেছে ... পরীক্ষার পরিবেশে আমার যা প্রয়োজন ছিল তা ....
প্রোফার্গ্যাসি

46

যদিও প্রশ্নের উত্তরটি সাধারণভাবে দেওয়া হয়েছে, আমি নিজেকে খুঁজে পেয়েছি যে এমন একটি ঘটনা আছে যখন এমনকি বিদ্যমান জ্ঞাত_ হোস্ট এন্ট্রি সহায়তা করে না। যখন কোনও এসএসএইচ সার্ভার ইসিডিএসএ ফিঙ্গারপ্রিন্ট প্রেরণ করে এবং ফলস্বরূপ, তখন আপনার এন্ট্রি থাকবে:

|1|+HASH=|HASH= ecdsa-sha2-nistp256 FINGERPRINT=

সমস্যাটি হ'ল জেএসচ SHA_RSA পছন্দ করে এবং এটি সংযোগ করার সময় SHA-RSA ফিঙ্গারপ্রিন্টের সাথে তুলনা করার চেষ্টা করবে, যার ফলে "অজানা হোস্ট" সম্পর্কে ত্রুটি হবে।

এটি সহজভাবে চালানোর জন্য:

$ ssh-keyscan -H -t rsa example.org >> known_hosts

অথবা স্থানীয় হোস্টকিএলগোরিদিম সেটিংটি ব্যবহার না করে SHA_RSA উপস্থাপিত করার বিষয়ে জ্যাকার্টের কাছে অভিযোগ করুন , যদিও তারা তাদের বাগগুলি ঠিক করতে খুব আগ্রহী বলে মনে হয় না ।


1
আমরা একইরকম একটি ক্ষেত্রে আছি ecdsa-sha2-nistp384এবং আপনার সমাধানটি খুব ভালভাবে কাজ করে। তদনুসারে ওপেনশ-কিস্ক্যান ম্যানুয়াল , এবং আমাদের প্রয়োজন অনুসারে আমরা চালাই ssh-keyscan -t rsa,ecdsa example.org >> known_hosts
তারিংগামবারিনী

1
আমার এ জাতীয় সমস্যা ছিল, তবে ব্যতিক্রম ছিল জেএসএক্সএক্সসেপশন: হোস্টকেয়কে প্রত্যাখ্যান করুন: জেএসএক্সএক্সেপশনের পরিবর্তে : অজানাহস্টকি (এটি কিছু অন্যান্য ব্যবহারকারীকে সাহায্য করতে পারে)
বিডুলাক

@ ক্রিশ্নাকুমার্প প্রস্তাবিত হিসাবে সেট ছাড়াও আমাকে অতিরিক্ত সংযুক্ত হোস্ট ফাইল যুক্ত করতে হয়েছিল
ওল্ফগ্যাং ফাহল

34

হোস্ট কী পরীক্ষা করা এড়ানো এটি একটি সুরক্ষা ঝুঁকি।

জেএসএচ এটি পরিচালনা করতে হোস্টকি রেপোসিটরি ইন্টারফেস এবং এর ডিফল্ট বাস্তবায়ন কমনহোস্ট ক্লাস ব্যবহার করে। আপনি একটি বিকল্প বাস্তবায়ন সরবরাহ করতে পারেন যা হোস্টকিরিপোসিটোরি বাস্তবায়নের মাধ্যমে নির্দিষ্ট কীগুলিকে অনুমতি দেয়। অথবা আপনি যে কীগুলি আপনার জানাতে চান সেগুলি ফাইলের পরিচিত_হোস্টের ফর্ম্যাট এবং কলটিতে রাখতে পারেন

jsch.setKnownHosts(knownHostsFileName);

বা নীচে যেমন একটি পাবলিক কী স্ট্রিং সহ।

String knownHostPublicKey = "mysite.com ecdsa-sha2-nistp256 AAAAE............/3vplY";
jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

দেখতে Javadoc আরো বিস্তারিত জানার জন্য।

এটি আরও সুরক্ষিত সমাধান হবে।

Jsch ওপেন সোর্স এবং আপনি এখান থেকে উত্সটি ডাউনলোড করতে পারেন । উদাহরণস্বরূপ ফোল্ডারে, আরও বিশদ জানার জন্য ज्ञিতহোস্ট.জভা অনুসন্ধান করুন।


16

আপনি ssh এর জন্য কোন প্রোগ্রাম ব্যবহার করেন তার উপর নির্ভর করে সঠিক কী পাওয়ার উপায়টি বিভিন্ন রকম হতে পারে। পুটি (উইন্ডোজ দিয়ে জনপ্রিয়) ssh কীগুলির জন্য নিজস্ব ফর্ম্যাট ব্যবহার করে। লিনাক্স এবং বিএসডি-র বেশিরভাগ রূপের সাথে আমি দেখেছি, আপনাকে কেবল সন্ধান করতে হবে ~/.ssh/known_hosts। আমি সাধারণত একটি লিনাক্স মেশিন থেকে এসএসএস করি এবং তারপরে এই ফাইলটি একটি উইন্ডোজ মেশিনে অনুলিপি করি। তারপরে আমি এর মতো কিছু ব্যবহার করি

jsch.setKnownHosts("C:\\Users\\cabbott\\known_hosts");

ধরে নিচ্ছি আমি ফাইলটি C:\Users\cabbottআমার উইন্ডোজ মেশিনে রেখেছি। আপনার যদি লিনাক্স মেশিনে অ্যাক্সেস না থাকে তবে http://www.cygwin.com/ ব্যবহার করে দেখুন

হতে পারে অন্য কেউ উইন্ডোজ বিকল্পের পরামর্শ দিতে পারে। আমি এসএসএইচ কীগুলিকে নিষ্ক্রিয় করার জন্য একটি মানহীন বিন্যাসে রেজিস্ট্রিগুলিতে সংরক্ষণ করে পট্টির উপায় খুঁজে পাই।


উইন্ডোজ এসএইচ ইন ব্যবহার করে cygwin(আপনাকে opensslপ্যাকেজ এবং নির্ভরতা ডাউনলোড করতে হবে) আমি ডাউনলোড করতে সক্ষম হয়েছি ~/.ssh/known_hosts। @ চ্যারিটিএবটকে ধন্যবাদ
তারিংগম্বেরিনী

10

হোস্টের সর্বজনীন আরএসএ কী সরবরাহ করুন: -

String knownHostPublicKey = "mywebsite.com ssh-rsa AAAAB3NzaC1.....XL4Jpmp/";

session.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

1
আমার জন্য jsch সংস্করণ 0.1.50 (সর্বদা jsch এ একটি এনপিই পেয়েছিল) নিয়ে কাজ করেনি তবে নতুন সংস্করণটি 0.1.53 এর সাথে কাজ করছে।
উদো

যখন Jsch কোড (Util.byte2str ()) ইউটিএফ -8 এনকোডিংয়ের প্রত্যাশা করবে তখন কি (স্ট্রিং.জেটবাইটস) ইউনিকোড-এনকোডেড অক্ষরের একটি বাইট অ্যারে সরবরাহ করবে?
সমৃদ্ধ পি

7

আপনি সহজভাবে করতে পারেন

session.setConfig("StrictHostKeyChecking", "no");

এটি সুরক্ষিত নয় এবং এটি বিশ্বজুড়ে পরিবেশের জন্য উপযুক্ত নয় এমন একটি কাজ যা বিশ্বব্যাপী পরিচিত হোস্ট কীগুলি পরীক্ষা করা অক্ষম করবে।


2
এই কোডটি প্রশ্নের উত্তর দিতে সহায়তা করতে পারে, কেবল কোডের উত্তরগুলি উচ্চমানের নয়। একটি উত্তরের উত্তর কোডটি কী করে তা ব্যাখ্যা করবে, এটি কোথায় প্রবেশ করানো হবে তা বলুন, কেন এই পদ্ধতির ব্যবস্থা নেওয়া হয়েছিল তা ব্যাখ্যা করুন এবং প্রাসঙ্গিক ডকুমেন্টেশনের লিঙ্ক করুন।
স্টিফেন অস্টেরমিলার

6

আপনি নিম্নলিখিত কোডটি কার্যকর করতে পারেন। এটি পরীক্ষিত এবং কাজ করা হয়।

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;

public class SFTPTest {

    public static void main(String[] args) {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession("username", "mywebsite.com", 22); //default port is 22
            UserInfo ui = new MyUserInfo();
            session.setUserInfo(ui);
            session.setPassword("123456".getBytes());
            session.connect();
            Channel channel = session.openChannel("sftp");
            channel.connect();
            System.out.println("Connected");
        } catch (JSchException e) {
            e.printStackTrace(System.out);
        } catch (Exception e){
            e.printStackTrace(System.out);
        } finally{
            session.disconnect();
            System.out.println("Disconnected");
        }
    }

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {

        @Override
        public String getPassphrase() {
            return null;
        }
        @Override
        public String getPassword() {
            return null;
        }
        @Override
        public boolean promptPassphrase(String arg0) {
            return false;
        }
        @Override
        public boolean promptPassword(String arg0) {
            return false;
        }
        @Override
        public boolean promptYesNo(String arg0) {
            return false;
        }
        @Override
        public void showMessage(String arg0) {
        }
        @Override
        public String[] promptKeyboardInteractive(String arg0, String arg1,
                String arg2, String[] arg3, boolean[] arg4) {
            return null;
        }
    }
}

উপযুক্ত মান বিকল্প করুন।


হ্যাঁ, আমি আমার উল্লেখের জন্য এটি যুক্ত করেছিলাম had আমি এটি সরিয়ে ফেলব। ধন্যবাদ।
বিষ্ণু প্রসাদ কল্লুমেল

1
কীবোর্ড-ইন্টারেক্টিভ প্রমাণীকরণ পদ্ধতি প্রস্তাব করে এমন কিছু এসএসএইচ সার্ভারের সাথে সংযোগ করার সময় এটি কিছু ধরণের অদ্ভুত লেখার সমস্যা তৈরি করেছিল। আমি মূল জিনিসটি থেকে মুক্তি পেতে বছরের পর বছর এটি ব্যবহার করেছি এবং তারপরে একটি নির্দিষ্ট সার্ভার দিয়ে ঠিক আজ পোড়া হয়েছি। কারণ আমি গেটপ্যাসওয়ার্ডের মাধ্যমে পিডব্লিউ সরবরাহ করিনি () তবে সরাসরি সেশন অবজেক্টে। মন যে রাখতে. আমি এটি আর ব্যবহার করতে চাই না।
মার্ক

1

কেবলমাত্র "ব্যবহারকারী", "পাস", "এসএসএইচডি_আইপি" প্রতিস্থাপন করুন। এবং সার্ভারের ~ / .ssh / জ্ঞাত_হোস্টের সামগ্রী সহ ज्ञিত_হোস্ট.টেক্সট নামে একটি ফাইল তৈরি করুন। আপনি একটি খোল পাবেন।

public class Known_Hosts {
public static void main(String[] arg) {
    try {
        JSch jsch = new JSch();
        jsch.setKnownHosts("known_hosts.txt");
        Session session = jsch.getSession("user", "SSHD_IP", 22);
        session.setPassword("pass");
        session.connect();
        Channel channel = session.openChannel("shell");
        channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        channel.connect();
    } catch (Exception e) {
        System.out.println(e);
    }
  }
}

নাহ আমার পক্ষে কাজ করে না। একইভাবে, এরিক লেসচিনস্কি / রাকেশ আচার্যের উত্তর ব্যর্থ হয় যদি আমি মন্তব্য করি তবে config.put("StrictHostKeyChecking", "no"); কোনও ম্যানুয়াল ssh -vসংযোগে .ssh/known_hostsফাইলটি কী ( ecdsa-sha2-nistp256) ধারণ করে তবে কোডটি এটি করে: com.jcraft.jsch.JSchException: UnknownHostKey: 131.132.x.x. RSA key fingerprint is c2:... at com.jcraft.jsch.Session.checkHost(Session.java:805) at com.jcraft.jsch.Session.connect(Session.java:345)
hiর্মিছুর

এটি কিছু সময় হয়ে গেছে, আমি যা করার চেষ্টা করছিলাম, 13 ই জুন 2013 এ উপলব্ধ জেএসসিএইচ লাইব্রেরি সংস্করণটি ব্যবহার করছে, কারণ সম্ভবত গ্রন্থাগারে জিনিসগুলি পরিবর্তিত হয়েছে
ডালভারেজমার্টিনেজ 1

1

ফিস্ট মুদ্রণের মান নির্ধারণের চেয়ে পরিচিত হোস্টটি সেট করা ভাল।

যখন আপনি পরিচিত হোস্টটি সেট করেন, অ্যাপ্লিকেশনটি চালিত বাক্স থেকে ম্যানুয়ালি (প্রথমে অ্যাপ্লিকেশন চালুর আগে) চেষ্টা করার চেষ্টা করুন।


1

এই বোকা ইস্যুতে আমি অনেক সময় হারাতে পেরেছি এবং আমি মনে করি এই বার্তাটি বেশ সঠিক "" যে ফাইলটি আমি অ্যাক্সেস করছি তার মধ্যে হোস্ট নেই "তবে আপনার সিস্টেমে আপনার জ্ঞাত_হোস্ট ফাইলের চেয়ে বেশি থাকতে পারে (উদাহরণস্বরূপ আমি আমি মোবাএক্সটার্ম ব্যবহার করছি এবং এটি মূল ডিরেক্টরি থেকে বাড়িটি মাউন্ট করার ইনস্টলেশন ডিরেক্টরিটির অভ্যন্তরে রয়েছে)

যদি আপনি অভিজ্ঞ হন: এটি কমান্ড লাইন থেকে কাজ করছে তবে অ্যাপ্লিকেশনটি গঠন করে না আপনার ssh সহ আপনার দূরবর্তী সার্ভারে অ্যাক্সেস করার চেষ্টা করুন এবং ভার্বোজ -v বিকল্পের সাহায্যে পরীক্ষা করুন যা বর্তমানে নিম্নলিখিত ফাইলটি ব্যবহৃত হচ্ছে:

 ssh -v git@gitlab.com
 OpenSSH_6.2p2, OpenSSL 1.0.1g 7 Apr 2014
 debug1: Reading configuration data /etc/ssh_config
 debug1: Connecting to gitlab.com [104.210.2.228] port 22.
 debug1: Connection established.
 debug1: identity file /home/mobaxterm/.ssh/id_rsa type 1
 debug1: identity file /home/mobaxterm/.ssh/id_rsa-cert type -1
 debug1: identity file /home/mobaxterm/.ssh/id_dsa type -1
 debug1: identity file /home/mobaxterm/.ssh/id_dsa-cert type -1
 debug1: identity file /home/mobaxterm/.ssh/id_ecdsa type -1
 debug1: identity file /home/mobaxterm/.ssh/id_ecdsa-cert type -1
 debug1: Enabling compatibility mode for protocol 2.0
 debug1: Local version string SSH-2.0-OpenSSH_6.2
 debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2      Ubuntu-4ubuntu2.1
 debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 pat OpenSSH*
 debug1: SSH2_MSG_KEXINIT sent
 debug1: SSH2_MSG_KEXINIT received
 debug1: kex: server->client aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
 debug1: kex: client->server aes128-ctr hmac-sha1-etm@openssh.com zlib@openssh.com
 debug1: sending SSH2_MSG_KEX_ECDH_INIT
 debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
 debug1: Server host key: RSA b6:03:0e:39:97:9e:d0:e7:24:ce:a3:77:3e:01:42:09
 debug1: Host 'gitlab.com' is known and matches the RSA host key.
 debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19
 debug1: ssh_rsa_verify: signature correct

আপনি দেখতে পারেন কীটি পাওয়া গেছে:

debug1: Found key in /home/mobaxterm/.ssh/known_hosts:19

এবং সি এর অধীনে আমার উইন্ডো হোমগুলিতে নয় : \ ব্যবহারকারী \ my_local_user \। এসএসএস , আমি কেবল সেগুলি একীভূত করেছি এবং সমস্যার সমাধানের জন্য সারিবদ্ধ।

আশা করি এটি ভবিষ্যতে কাউকে সহায়তা করবে


0

কেউ কি এই সমস্যার সমাধান করতে সক্ষম হয়েছেন? আমি পাবলিক কী প্রমাণীকরণ ব্যবহার করে ফাইলগুলি স্ক্রিপ করতে Jscp ব্যবহার করছি (আমি পাসওয়ার্ড প্রমাণীকরণ ব্যবহার করতে চাই না)। সাহায্য প্রশংসা করা হবে !!!

এই স্ট্যাকওভারফ্লো এন্ট্রি হোস্ট-কী পরীক্ষার বিষয়ে, এবং পাবলিক কী প্রমাণীকরণের সাথে কোনও সম্পর্ক নেই।

পাবলিক কী প্রমাণীকরণের কথা হিসাবে, আপনার সমতল (সিফার্ডহীন) ব্যক্তিগত কী দিয়ে নিম্নলিখিত নমুনাটি ব্যবহার করে দেখুন,


0
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("user", "hostname", 22); // default
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.setPassword("password".getBytes());
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
System.out.println("Connected");
} catch (JSchException e) {
e.printStackTrace(System.out);
} catch (Exception e) {
e.printStackTrace(System.out);
} finally {
session.disconnect();
System.out.println("Disconnected");
}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.