2011-10-24 12 views
6

में फिंगरप्रिंट के साथ `ssh-rsa` होस्ट कुंजी को सत्यापित नहीं कर सका, मुझे sshj (sshj v0.6.0 का उपयोग कर रहा हूं) के साथ एक अजीब समस्या है जिसके लिए मुझे किसी से कुछ मदद चाहिए। सार्वजनिक कुंजी के साथ प्रमाणीकरण कुछ मशीनों पर ठीक काम करता है लेकिन अन्य मशीनों पर ठीक काम नहीं करता है और मुझे नीचे की त्रुटि दिखाई देती है।"[HOST_KEY_NOT_VERIFIABLE] से निपटने" sshj

फर्क सिर्फ इतना है कि मैं समझ सकता है कि प्रश्न अर्थात coonradt में यूनिक्स आईडी केवल बॉक्स जिस पर नीचे दी गई त्रुटियां ट्रिगर होते हैं

पर ~/.ssh/config के तहत नीचे सूचीबद्ध विन्यास सेटअप करने लगता था
Host * 
    Protocol 1,2 
    FallBackToRsh no 
    ForwardAgent yes 
    ForwardX11 yes 
    PasswordAuthentication yes 
    RhostsAuthentication no 
    RhostsRSAAuthentication no 
    RSAAuthentication yes 
    NoHostAuthenticationForLocalhost yes 
    StrictHostKeyChecking no 
    KeepAlive yes 

उपर्युक्त कॉन्फ़िगरेशन फ़ाइल से मैंने सीखा कि प्रश्न में आईडी प्रोटोकॉल 1,2 का उपयोग करना चाहती है और मुझे संदेह है कि इसमें मेरी असफलताओं के साथ कुछ करना पड़ सकता है (मुझे इसके बारे में बहुत यकीन नहीं है, लेकिन यह सिर्फ एक झटका है)

अन्य सभी यूनिक्स आईडी के लिए जिनके लिए यह ठीक काम करता है, मेरे पास ऐसी कोई कॉन्फ़िगर फ़ाइल नहीं है।

पीएस: मैं यूनिक्स आईडी "कोऑनराट" की कॉन्फ़िगरेशन को परिवर्तित नहीं कर सकता क्योंकि यह आईडी केंद्रीय हडसन सर्वर द्वारा उपयोग की जा रही है। अगर किसी कृपया मेरी मदद कर सकता का सुझाव देने के रूप में यहाँ क्या

गलत के बाद हो सकता है त्रुटि है कि मैं देख रहा हूँ है

का स्वागत करेंगे:

Oct 24, 2011 2:30:37 AM net.schmizz.sshj.DefaultConfig initCipherFactories 
WARNING: Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl init 
INFO: Client identity string: SSH-2.0-SSHJ_0_6_0 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl init 
INFO: Server identity string: SSH-1.99-OpenSSH_4.3 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.KeyExchanger sendKexInit 
INFO: Sending SSH_MSG_KEXINIT 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.KeyExchanger handle 
INFO: Received SSH_MSG_KEXINIT 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.kex.AbstractDHG init 
INFO: Sending SSH_MSG_KEXDH_INIT 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.KeyExchanger handle 
INFO: Received kex followup data 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.kex.AbstractDHG next 
INFO: Received SSH_MSG_KEXDH_REPLY 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl die 
SEVERE: Dying because - net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41` for `mymachine.domain.com` on port 22 
Oct 24, 2011 2:30:38 AM net.schmizz.concurrent.Promise tryRetrieve 
SEVERE: <<kex done>> woke to: net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41` for `mymachine.domain.com` on port 22 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl setService 
INFO: Setting active service to null-service 
Oct 24, 2011 2:30:38 AM com.test.jaws.execution.ssh.impl.SSHJClientImpl$ExceptionHandler handleSevereCondition 
SEVERE: mymachine.domain.com is not added to your /x/home/coonradt/.ssh/known_hosts file. 
Throwable occurred: net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41` for `mymachine.domain.com` on port 22 
    at net.schmizz.sshj.transport.KeyExchanger.verifyHost(KeyExchanger.java:222) 
    at net.schmizz.sshj.transport.KeyExchanger.handle(KeyExchanger.java:373) 
    at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:477) 
    at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:127) 
    at net.schmizz.sshj.transport.Decoder.received(Decoder.java:195) 
    at net.schmizz.sshj.transport.Reader.run(Reader.java:72) 
+0

मुझे लगता है कि समस्या वास्तव में coonradt उपयोगकर्ता कॉन्फ़िगरेशन के साथ है, SEVERE नोटिस देखें: "SEVERE: mymachine.domain.com आपके /x/home/coonradt/.ssh/known_hosts फ़ाइल में नहीं जोड़ा गया है। "आपको शायद इसे ठीक करना चाहिए ;-) –

+0

हाय त्वरित उत्तर के लिए आपको बहुत बहुत धन्यवाद। लेकिन क्या आप कृपया सुझाव दे सकते हैं कि उपयोगकर्ता को फिक्स क्या होना चाहिए? क्या इसका मतलब है कि मुझे प्रोटोकॉल से छुटकारा पाना होगा कॉन्फ़िगरेशन फ़ाइल में सेक्शन? मैं उम्मीद कर रहा था कि एसएसजेजे किसी भी तरह से मुझे प्रोटोकॉल संस्करण को निर्दिष्ट करने की इजाजत देगी, जिसका उपयोग किया जा सकता है (अगर मुझे लगता है कि कृपया मेरी बेवकूफी के साथ सहन करें, लेकिन जैसा कि मैंने पहले स्वीकार किया था कि मैं आंतरिक पर बहुत ज्यादा नहीं जानता एसएसएच कैसे काम करता है) –

+0

वास्तव में प्रोटोकॉल के साथ बहुत कम करना पड़ता है (वास्तव में, जहां तक ​​इस संदेश का संबंध नहीं है)। क्या होने की आवश्यकता है कि फ़ाइल '/ x/home/coonradt /।ssh/known_hosts 'में इस मामले में आपके क्लाइंट का फिंगरप्रिंट होना चाहिए। मुझे लगता है कि आप एक सुरक्षा उपाय पर ठोकर खा चुके हैं कि प्रत्येक सर्वर उस सर्वर का उपयोग उस सर्वर से कनेक्ट नहीं कर सकती है। –

उत्तर

12

कैसे इस मशीन के लिए एक HostKeyVerifier जोड़ने के बारे में?

sshClient.addHostKeyVerifier("ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41"); 

कारण यह स्वचालित रूप से नहीं होता है शायद इसलिए है क्योंकि known_hosts फ़ाइल $ (user.home) पर नहीं है /। Ssh/known_hosts। आप ज्ञात मेजबान को किसी विशिष्ट स्थान से स्पष्ट रूप से लोड भी कर सकते हैं।

sshClient.loadKnownHosts(new File("path_to_known_hosts")); 
+0

@ शिकार: मुझे नहीं लगता कि इस मुद्दे को ज्ञात_होस्ट फ़ाइल के साथ कुछ भी करना है। मुझे पता चला कि sshj बस मेरे सीमित ज्ञान में ssh v1 प्रोटोकॉल को संभाल नहीं करता है। –

+1

@ शिकार: कृपया https://gist.github.com/1321719 पर एक नज़र डालें जो समस्या का विवरण देता है। –

+0

@ शिकार: मैं आपको यह बताना भूल गया कि ज्ञात_होस्ट फ़ाइल ~/.ssh फ़ोल्डर के अंतर्गत उपलब्ध है और मैंने इसकी उपलब्धता की पुष्टि की है। –

0

वैकल्पिक उत्तर के लिए यह सुनिश्चित करें कि जिस होस्टनाम से आप कनेक्ट करने का प्रयास कर रहे हैं वह आपके ज्ञात_होस्ट फ़ाइल में बिल्कुल एक मैच है। एक उदाहरण गलती है कि मैं कर रहा था पूर्ण URL bob.insidenetwork.pvt कनेक्ट करने का प्रयास किया गया था, लेकिन मेरी known_hosts फ़ाइल एक प्रविष्टि के रूप में केवल bob था, क्योंकि जब मैं मैन्युअल रूप से मैं अभी तक भी पूरा URL टाइप करने के लिए आलसी हूँ ssh ...

7
try { 
    ssh.connect(envConf.getIp(), port); 
} catch (TransportException e) { 
    if (e.getDisconnectReason() == DisconnectReason.HOST_KEY_NOT_VERIFIABLE) { 
     String msg = e.getMessage(); 
     String[] split = msg.split("`"); 
     String vc = split[3]; 
     ssh = new SSHClient(); 
     ssh.addHostKeyVerifier(vc); 
     ssh.connect(envConf.getIp(), port); 
    } else { 
     throw e; 
    } 
} 
ssh.authPassword(envConf.getName(), envConf.getPw()); 
ssh.newSCPFileTransfer().download(envConf.getHomePath() + FilePath, toPath); 
8

आप किसी भी सत्यापन के बिना सभी कुंजियों को स्वीकार करने के SSH ग्राहक निर्धारित कर सकते हैं (पर ध्यान नहीं देता कुंजी सत्यापन की मेजबानी)

SSHClient sshClient = new SSHClient(); 
sshClient.addHostKeyVerifier(new PromiscuousVerifier()); 
... 
-1

यह मेरे लिए काम करता है:

try (final SSHClient sshClient = new SSHClient()) { 
    sshClient.addHostKeyVerifier(new PromiscuousVerifier()); 
    KeyProvider keys = sshClient.loadKeys("path_to_private_key.ppk"); 
    sshClient.connect("hostname"); 
    sshClient.authPublickey("username", keys); 
} catch (IOException e) { 
} 
+1

अपवादों को छोड़ना एक बुरा अभ्यास है। – Kenster