2012-02-14 27 views
6

Tôi có một tệp pem trông giống như tệp trong thử nghiệm SSHJ (mặc dù tôi không thấy nó đang được tham chiếu): https://github.com/shikhar/sshj/blob/master/src/test/resources/hostkey.pem. Chỉ cần cố gắng xác thực thông qua tệp pem tới một cá thể EC2 (đọc dưới dạng chuỗi), nhưng gặp sự cố. Bất cứ ai làm điều này?SSHJ - Đăng nhập cặp khóa vào ví dụ EC2

SSHClient ssh = new SSHClient(); 
    ssh.connect("ec2-XXXXXXX.compute-1.amazonaws.com"); 
    ssh.authPublickey("ubuntu", getPemAsString("/Users/me/ec2.pem")); 
    final Session session = ssh.startSession(); 
    session.exec("echo -e \"test\" >> /home/ubuntu/testfile"); 

Lỗi là dưới đây:

INFO [main] (TransportImpl.java:152) - Client identity string: SSH-2.0-SSHJ_0_8 
INFO [main] (TransportImpl.java:161) - Server identity string: SSH-2.0-OpenSSH_5.8p1 Debian-7ubuntu1 
INFO [main] (KeyExchanger.java:195) - Sending SSH_MSG_KEXINIT 
INFO [reader] (KeyExchanger.java:357) - Received SSH_MSG_KEXINIT 
INFO [reader] (AbstractDHG.java:110) - Sending SSH_MSG_KEXDH_INIT 
INFO [reader] (KeyExchanger.java:370) - Received kex followup data 
INFO [reader] (AbstractDHG.java:120) - Received SSH_MSG_KEXDH_REPLY 
ERROR [reader] (TransportImpl.java:570) - Dying because - net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `xx:0a:xx:b5:c2:fd:44:1d:e0:e4:fc:d8:5f:f8:dd:f6` for `ec2-XXXX.compute-1.amazonaws.com` on port 22 
INFO [reader] (TransportImpl.java:302) - Setting active service to null-service 
ERROR [main] (Promise.java:171) - <<kex done>> woke to: net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `xx:0a:xx:b5:c2:fd:44:1d:e0:e4:fc:xx:5f:f8:dd:f6` for `ec2-XXXX.compute-1.amazonaws.com` on port 22 

EDIT: Vẫn không có may mắn. Phải làm điều gì đó sai với khóa riêng AWS tạo ra để đăng nhập?

SSHClient ssh = new SSHClient(); 
ssh.connect("ec2-XXX.compute-1.amazonaws.com"); 
ssh.addHostKeyVerifier("dd:9c:XX:fa:6a:XX:32:6a:2b:c3:e7:bd:2b:15:26:5f:76:b6:‌​c4:fe"); 
ssh.authPublickey("ubuntu", getRSAPrivateKeyAsString("mypem")); // Must be wrong? 

final Session session = ssh.startSession(); 
session.exec("echo -e \"test\" >> /home/ubuntu/testfile"); 
+0

bạn đang thêm người xác minh chính chủ sau khi gọi connect(), nó phải đi trước như việc xác minh sẽ xảy ra trong quá trình kết nối – shikhar

+0

Cuối cùng Tôi thực sự thấy nó tốt hơn để sử dụng JSch. Dưới đây là ví dụ về cách sử dụng thư viện này: http://stackoverflow.com/questions/16626612/keypair-login-to-ec2-instance-with-jsch – Scott

Trả lời

2

Nó không phải là xác thực người dùng đó là vấp ngã bạn, đó là xác minh chính chủ :)

Something như client.addHostKeyVerifier ("xx: 0a: xx: b5: c2: fd: 44: 1d: e0: e4: fc: xx: 5f: f8: dd: f6 ") trước khi kết nối.

+0

Tôi thấy :) Tuyệt vời, tôi sẽ dùng thử và quay lại bạn! –

+0

Tôi thực sự có một heck của một thời gian với điều này. Thêm dòng đó không giúp tôi. Tôi phải làm điều gì đó sai với khóa riêng RSA EC2 tạo ra cho các nhóm bảo mật? '' ' \t SSHClient ssh = new SSHClient(); \t \t ssh.connect ("ec2-XXX.compute-1.amazonaws.com"); \t \t ssh.addHostKeyVerifier ("dd: 9c: XX: fa: 6a: XX: 32: 6a: 2b: c3: e7: bd: 2b: 15: 26: 5f: 76: b6: c4: fe"); \t \t ssh.authPublickey ("ubuntu", getRSAPrivateKeyAsString ("mypem")); \t \t phiên cuối cùng phiên = ssh.startSession(); \t \t session.exec ("echo -e \" test \ ">>/home/ubuntu/testfile"); '' ' –

2

Tôi đã kết nối thành công tới một thể hiện Amazon EC2 sử dụng như sau:

final SSHClient ssh = new SSHClient(); 
ssh.addHostKeyVerifier("XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"); 

ssh.connect("host"); 

PKCS8KeyFile keyFile = new PKCS8KeyFile(); 
keyFile.init(new File("server_pem.pem")); 
ssh.auth("ec2-user", new AuthPublickey(keyFile)); 

try { 
    final Session session = ssh.startSession(); 
    try { 
     final Command command = session.exec("whoami"); 
     String response = IOUtils.readFully(command.getInputStream()).toString(); 
     command.join(10, TimeUnit.SECONDS); 
     return response; 
    } finally { 
     session.close(); 
    } 
} finally { 
    ssh.disconnect(); 
} 
3

Các ví dụ đưa ra để kết nối với EC2 không ban đầu làm việc cho tôi cho đến khi tôi thêm BouncyCastleProvider đến lớp java.security.Security . Ví dụ đơn giản mà làm việc cho tôi (viết bằng Groovy vì đơn giản) là:

@Grab(group='net.schmizz', module='sshj', version='0.8.1') 
@Grab(group='org.bouncycastle', module='bcprov-jdk16', version='1.46') 

import net.schmizz.sshj.* 
import net.schmizz.sshj.userauth.keyprovider.* 
import net.schmizz.sshj.common.* 
import net.schmizz.sshj.transport.verification.PromiscuousVerifier 
import net.schmizz.sshj.connection.channel.direct.Session 
import net.schmizz.sshj.connection.channel.direct.Session.Command 

import java.security.* 
import java.util.concurrent.TimeUnit 

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

client = new SSHClient() 
client.addHostKeyVerifier(new PromiscuousVerifier()) 
client.connect("ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com") 

PKCS8KeyFile keyFile = new PKCS8KeyFile() 
keyFile.init(new File("/dev/ec2/key/mykey.pem")) 
client.authPublickey("ubuntu",keyFile) 

final Session session = client.startSession() 
final Command cmd = session.exec("whoami") 
String response = IOUtils.readFully(cmd.getInputStream()).toString() 
cmd.join(10, TimeUnit.SECONDS) 

println response //ubuntu 

session.close() 
client.disconnect() 
+0

Cũng giống như một lưu ý đối với tôi, tôi đã sử dụng định dạng này cho một phiên bản Linux nội bộ mà tôi đang kết nối tới. Sự bổ sung quan trọng mà tôi cần là Security.addProvider (new org.bouncycastle.jce.provider.BouncyCastleProvider()); hàng. –

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