2011-10-24 31 views
6

Tôi gặp sự cố lạ với sshj (đang sử dụng sshj v0.6.0) mà tôi cần một số trợ giúp từ ai đó. Xác thực bằng khóa công khai hoạt động tốt trên một số máy nhưng không hoạt động tốt trên các máy khác và tôi thấy lỗi dưới đây.Đối phó với "[HOST_KEY_NOT_VERIFIABLE] Không thể xác minh khóa máy chủ` ssh-rsa` bằng dấu vân tay "trong sshj

Sự khác biệt duy nhất mà tôi có thể tạo ra là UNIX ID trong câu hỏi viz coonradt dường như có cấu hình được liệt kê dưới đây dưới ~/.ssh/config chỉ trên hộp mà các lỗi dưới đây đang được kích hoạt

Host * 
    Protocol 1,2 
    FallBackToRsh no 
    ForwardAgent yes 
    ForwardX11 yes 
    PasswordAuthentication yes 
    RhostsAuthentication no 
    RhostsRSAAuthentication no 
    RSAAuthentication yes 
    NoHostAuthenticationForLocalhost yes 
    StrictHostKeyChecking no 
    KeepAlive yes 

Từ tệp cấu hình ở trên, tôi đã biết rằng ID được đề cập được sử dụng Giao thức 1,2 và tôi nghi ngờ rằng điều này có thể liên quan đến lỗi của tôi (tôi không chắc chắn về điều đó, nhưng đây chỉ là linh cảm)

Đối với tất cả các ID UNIX khác mà tác phẩm này hoạt động tốt, tôi không có bất kỳ tệp cấu hình nào như vậy.

PS: Tôi không thể thay đổi cấu hình của ID UNIX "coonradt" vì ID này đang được các máy chủ hudson trung tâm sử dụng.

sẽ đánh giá cao nếu ai đó có thể vui lòng giúp tôi gợi ý như những gì có thể là sai ở đây

Sau đây là những lỗi mà tôi đang nhìn thấy:

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

Tôi nghĩ rằng vấn đề thực sự là với cấu hình người dùng coonradt, xem thông báo SEVERE: "SEVERE: mymachine.domain.com không được thêm vào tệp /x/home/coonradt/.ssh/known_hosts của bạn. "Có lẽ bạn nên sửa lỗi này ;-) –

+0

Xin cảm ơn bạn rất nhiều vì câu trả lời nhanh chóng. Nhưng bạn có thể đề xuất cách sửa lỗi sẽ được sửa cho người dùng không? Có nghĩa là tôi sẽ phải loại bỏ Giao thức Tôi đã hy vọng rằng sshj bằng cách nào đó sẽ cho phép tôi chỉ định phiên bản giao thức cũng có thể được sử dụng (Xin vui lòng chịu sự ngây thơ của tôi nếu có vẻ vô nghĩa, nhưng như tôi thú nhận trước khi tôi không biết quá nhiều trên internals về cách thức hoạt động của ssh) –

+0

Nó thực sự có rất ít việc phải làm với giao thức (trên thực tế, không có gì liên quan đến thông điệp này). Điều gì cần xảy ra là tệp '/ x/home/coonradt /.ssh/known_hosts 'phải chứa dấu vân tay của ứng dụng khách trong trường hợp này. Tôi nghĩ rằng bạn đã tình cờ gặp một biện pháp bảo mật mà không phải mọi máy tính đều có thể kết nối bằng cách sử dụng người dùng đó với máy chủ đó. –

Trả lời

12

Làm thế nào về việc thêm một HostKeyVerifier cho máy tính này?

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

Lý do không xảy ra tự động có thể do tệp known_host không có giá $ (user.home)/.ssh/known_hosts. Bạn cũng có thể tải một cách rõ ràng các máy chủ đã biết từ một vị trí cụ thể.

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

@Shikar: Tôi không nghĩ rằng vấn đề này có liên quan gì đến tệp known_host. Tôi đã tìm ra rằng sshj chỉ không xử lý giao thức ssh v1 trong kiến ​​thức hạn chế của tôi. –

+1

@Shikar: Vui lòng xem https://gist.github.com/1321719 chi tiết sự cố. –

+0

@Shikar: Tôi cũng quên nói với bạn rằng tệp known_hosts có sẵn trong thư mục ~/.ssh và tôi đã xác nhận tính khả dụng của nó ở đó. –

0

Để có câu trả lời thay thế đảm bảo rằng tên máy chủ bạn đang cố kết nối chính xác là khớp với tệp known_host của bạn. Một ví dụ sai lầm mà tôi đã làm được cố gắng để kết nối với đầy đủ các URL bob.insidenetwork.pvt nhưng tập tin known_hosts tôi chỉ bob có như là một mục bởi vì khi tôi ssh tay tôi quá lười biếng để nhập toàn bộ URL ...

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

Bạn có thể thiết lập máy khách SSH để chấp nhận tất cả các phím mà không cần bất kỳ xác minh (bỏ qua tổ chức xác minh chính)

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

Nó làm việc cho tôi:

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

Loại trừ ngoại lệ là hành vi không tốt. – Kenster

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