2015-09-29 25 views
9

Tôi đang chạy chương trình java nơi tôi chuyển tệp từ một thư mục này sang thư mục khác, sử dụng Java SFTP. Vấn đề tôi đang gặp là tôi nhận được lỗi sau trong Java SFTP của tôi (sử dụng JSch):Làm thế nào để giải quyết Java UnknownHostKey, trong khi sử dụng thư viện JSch SFTP?

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 \ lớp; 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. Dấu vân tay khóa RSA là a2: 39: 3f: 44: 88: e9: 1f: d7: d1: 71: f4: 85: 98: fb: 90: dc tại com.jcraft.jsch.Session.checkHost (Phiên. java: 797) tại com.jcraft.jsch.Session.connect (Session.java:342) tại com.jcraft.jsch.Session.connect (Session.java:183) tại FileTransfer.main (FileTransfer.java: 33) Quy trình thoát với mã thoát 0.

sau đây là mã của tôi cho đến nay:

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 

My Cygwin được thiết lập, và tôi đã kiểm tra (với netstat -a -b) nó đang chạy.

Trả lời

14

Bạn đang cố bỏ qua kiểm tra khóa máy chủ bằng cách đặt StrictHostKeyChecking thành no.

Nhưng bạn phải làm điều đó trước khi kiểm tra, tức là trước session.connect().


Dù sao, bạn không bao giờ nên làm điều này, trừ khi bạn không quan tâm đến bảo mật. Việc kiểm tra khóa máy chủ có để bảo vệ bạn khỏi man-in-the-middle attacks.

Thay vào đó, hãy thiết lập khóa máy chủ được mong đợi để cho phép JSch xác minh.

Ví dụ:

  • Gọi JSch.setKnownHosts cung cấp một đường dẫn đến một tập tin .ssh/known_hosts -like.

    Để tạo tệp .ssh/known_hosts giống như, bạn có thể sử dụng lệnh ssh-keyscan từ OpenSSH.Nếu bạn đang kết nối từ một máy chủ * nix, bạn nên có các lệnh có sẵn, chỉ cần chạy

    ssh-keyscan example.com > known_hosts 
    

    Nó sẽ có một định dạng như:

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

    Và tham khảo các tạo known_hosts tập tin trong mã JSch của bạn .

    Nếu bạn đang sử dụng Windows, bạn có thể lấy bản dựng Windows ssh-keyscan, từ Win32-OpenSSH project hoặc Git cho Windows.

  • Gọi JSch.getHostKeyRepository().add() để cung cấp khóa máy chủ dự kiến ​​(ví dụ: mã hóa cứng, làm thông tin đăng nhập khác của bạn).

    Xem Creating JSch HostKey instance from a public key in .pub format.

+0

Làm cách nào để thực hiện bước "thiết lập khóa máy chủ dự kiến ​​để JSch xác minh điều đó". , cảm ơn – Coffee

+1

Tôi đã thêm một ví dụ để tạo tệp 'known_hosts'. –

+0

Tôi đã thử chạy 'ssh-keyscan example.com> known_hosts' trong Cygwin (trên Windows), nhưng tôi không biết phải làm gì tiếp theo ở đây .. nó có được tải xuống máy của tôi không? thanks – Coffee

1

Bên cạnh: bởi "Cygwin" tôi giả sử bạn có nghĩa là sshd hoặc sftpd, bởi vì chính Cygwin không thực hiện SSH.

Dù sao, nếu bạn muốn Jsch khách hàng để chấp nhận một phím bất kỳ từ máy chủ, di chuyển .setConfig cuộc gọi mà bộ StrictHostKeyChecking no nên rất trướcsession.connect(). Ngoài ra, bạn phải cung cấp quyền truy cập vào một cửa hàng chứa (các) khóa chính xác cho (các) máy chủ của bạn như @Martin giải thích - và bạn nên luôn làm điều đó khi kết nối với bất kỳ thứ gì ngoài "localhost" hoặc có thể là máy cùng một phân đoạn mạng an toàn về thể chất (chẳng hạn như một mạng LAN có dây trong một phòng đơn).

+0

* "bạn phải" *: Vui lòng không đề nghị bất kỳ ai không xác minh khóa máy chủ lưu trữ SSH. Ít nhất không phải không giải thích hậu quả. Đó là một sai lầm an ninh khủng khiếp. –

+0

@Martin điểm tốt, thêm –

+0

sftpd là gì bằng cách này? – Coffee

Các vấn đề liên quan