Saya mencoba menggunakan Jsch untuk membuat koneksi SSH di Jawa. Kode saya menghasilkan pengecualian berikut:
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
Saya tidak dapat menemukan cara memverifikasi kunci host dalam dokumentasi Jsch. Saya telah memasukkan kode saya di bawah ini.
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);
}
}
}
Jawaban:
Saya juga akan:
ssh
dari baris perintah dan menerima kunci publik (tuan rumah akan ditambahkan ke~/.ssh/known_hosts
dan semuanya harus kemudian bekerja dengan baik dari jsch) -ATAU-Konfigurasikan JSch untuk tidak menggunakan "StrictHostKeyChecking" (ini menimbulkan rasa tidak aman dan hanya digunakan untuk tujuan pengujian), menggunakan kode berikut:
Opsi # 1 (menambahkan host ke
~/.ssh/known_hosts
file) memiliki preferensi saya.sumber
JSch#setConfig("StrictHostKeyChecking", "no")
akan melakukan pekerjaan yang sama, tetapi hanya dalam satu baris~/.ssh/config
file saya untuk memperbaiki kesalahan di atas ketika saya tidak memiliki akses untuk mengubah kode sumberSementara pertanyaan telah dijawab secara umum, saya telah menemukan diriku bahwa ada kasus ketika bahkan ada known_hosts entri tidak membantu. Ini terjadi ketika server SSH mengirim sidik jari ECDSA dan sebagai hasilnya, Anda akan memiliki entri seperti ini:
Masalahnya adalah bahwa JSch lebih suka SHA_RSA dan saat menghubungkannya akan mencoba membandingkan sidik jari SHA-RSA, yang akan menghasilkan kesalahan tentang "host tidak dikenal".
Untuk memperbaiki ini cukup jalankan:
atau mengeluh kepada Jcraft tentang lebih memilih SHA_RSA daripada menggunakan pengaturan HostKeyAlgorithms lokal , meskipun mereka tampaknya tidak terlalu bersemangat untuk memperbaiki bug mereka .
sumber
ecdsa-sha2-nistp384
, dan solusi Anda bekerja dengan sangat baik. Sesuai dengan openssh-keyscan manual , dan kebutuhan kita, kita jalankanssh-keyscan -t rsa,ecdsa example.org >> known_hosts
.Ini adalah risiko keamanan untuk menghindari pemeriksaan kunci host.
JSch menggunakan antarmuka HostKeyRepository dan implementasi standarnya kelas FamousHosts untuk mengelola ini. Anda dapat memberikan implementasi alternatif yang memungkinkan kunci tertentu dengan menerapkan HostKeyRepository. Atau Anda dapat menyimpan kunci yang ingin Anda izinkan dalam file dalam format dan panggilan known_hosts
Atau dengan String kunci publik seperti di bawah ini.
lihat Javadoc untuk lebih jelasnya.
Ini akan menjadi solusi yang lebih aman.
Jsch adalah sumber terbuka dan Anda dapat mengunduh sumbernya dari sini . Di folder contoh, cari FamousHosts.java untuk mengetahui lebih detail.
sumber
Bergantung pada program apa yang Anda gunakan untuk ssh, cara untuk mendapatkan kunci yang tepat bisa bervariasi. Putty (populer dengan Windows) menggunakan format mereka sendiri untuk kunci ssh. Dengan sebagian besar varian Linux dan BSD yang pernah saya lihat, Anda hanya perlu melihatnya
~/.ssh/known_hosts
. Saya biasanya ssh dari mesin Linux dan kemudian menyalin file ini ke mesin Windows. Lalu saya menggunakan sesuatu yang mirip denganDengan asumsi saya telah menempatkan file di
C:\Users\cabbott
mesin Windows saya. Jika Anda tidak memiliki akses ke mesin Linux, coba http://www.cygwin.com/Mungkin orang lain dapat menyarankan alternatif Windows lain. Saya menemukan cara dempul menangani kunci SSH dengan menyimpannya di registri dalam format non-standar yang mengganggu untuk mengekstrak.
sumber
cygwin
(Anda harus mengunduhopenssl
paket dan dependensi) saya sudah bisa mengunduh~/.ssh/known_hosts
. Terima kasih kepada @CharityAbbott.Menyediakan kunci publik rsa tuan rumah: -
sumber
Anda juga bisa melakukannya
Ini tidak aman dan ini solusi yang tidak cocok untuk lingkungan hidup karena akan menonaktifkan pemeriksaan kunci host yang dikenal secara global.
sumber
Anda juga dapat menjalankan kode berikut. Ini diuji dan berfungsi.
Harap gantikan nilai yang sesuai.
sumber
Cukup gantikan "pengguna", "pass", "SSHD_IP". Dan buat file bernama known_hosts.txt dengan konten server ~ / .ssh / known_hosts. Anda akan mendapatkan sebuah shell.
sumber
config.put("StrictHostKeyChecking", "no");
.ssh -v
Sambungan manual mengungkapkan.ssh/known_hosts
file tersebut memang berisi kunci (ecdsa-sha2-nistp256
) tetapi kode melakukan ini: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)
pengaturan host yang dikenal lebih baik daripada pengaturan nilai cetak fingure.
Ketika Anda mengatur host yang dikenal, coba ssh secara manual (pertama kali, sebelum aplikasi berjalan) dari kotak aplikasi berjalan.
sumber
Saya kehilangan banyak waktu karena masalah bodoh ini, dan saya pikir pesannya benar "tidak ada host di file yang saya akses" tetapi Anda dapat memiliki lebih dari satu file know_host di sistem Anda (sebagai contoh saya Saya menggunakan mobaXterm dan menyimpannya sendiri di dalam direktori instalasi yang me-mount rumah dari root itu).
Jika Anda mengalami: itu bekerja dari baris perintah tetapi tidak dari aplikasi mencoba untuk mengakses ke server jauh Anda dengan ssh dan periksa dengan verbose -v opsi file mana yang saat ini digunakan contoh berikut:
seperti yang Anda lihat kunci ditemukan di:
dan tidak di jendela rumah saya di bawah C: \ Users \ my_local_user \ .ssh, saya hanya menggabungkan mereka dan disejajarkan untuk menyelesaikan masalah.
Semoga ini bisa membantu seseorang di masa depan
sumber
Entri stackoverflow ini adalah tentang pemeriksaan kunci-host, dan tidak ada kaitannya dengan otentikasi kunci publik.
Adapun otentikasi kunci publik, coba sampel berikut dengan kunci privat Anda (non ciphered),
sumber
sumber