2012-02-14 19 views
6

SSHJ testlerindeki gibi görünen bir pem dosyası var (referans olarak görmüyor olmamasına rağmen): https://github.com/shikhar/sshj/blob/master/src/test/resources/hostkey.pem. Basitçe pem dosyası aracılığıyla bir EC2 örneğine (string olarak okunur), ancak sorun yaşamaya çalışın. Bunu yapan var mı?SSHJ - EC2 örneğine giriş anahtarı oturum açma

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"); 

Hata aşağıdaki gibidir:

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 

DÜZENLEME: Hala şanslar. AWS, giriş için özel anahtar ile yanlış bir şey mi yapıyor olmalı?

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

Eğer, bu doğrulama Sonunda – shikhar

+0

bağlantı sırasında olduğu gibi kala vardır) (bağlamak çağrıldıktan sonra konak anahtarı doğrulayıcı ekliyoruz JSch kullanmak daha iyi buldum. İşte bu kütüphaneyi kullanmanın bir örneği: http://stackoverflow.com/questions/16626612/keypair-login-to-ec2-instance-with-jsch – Scott

cevap

2

Sizinle açma ediyor kullanıcı kimlik doğrulama değil, konak anahtarı doğrulama :) var

client.addHostKeyVerifier ("xx gibi bir şey: 0a: xx: b5: c2: fd: 44: 1d: e0: e4: fc: xx: 5f: f8: dd: f6 ") bağlanmadan önce.

+0

Görüyorum :) Harika, deneyeceğim ve geri döneceğim sen! –

+0

Aslında bununla bir zaman geçiriyorum. Bu hattı eklemek bana yardım etmiyor. Güvenlik grupları için RS2 özel anahtarı EC2'nin yarattığı yanlış bir şey mi yapıyor olmalıyım? '' ' \t SSHClient ssh = new SSHClient(); \t \t ssh.connect ("ec2-XXX.compute-1.amazonaws.com"); \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 final Oturum oturumu = ssh.startSession(); \t \t session.exec ("echo -e \" test \ ">>/home/ubuntu/testfile"); '' ' –

2

Ben başarıyla kullanan bir Amazon EC2 örneğine bağladıysanız aşağıdaki:

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

Ben java.security.Security sınıfına BouncyCastleProvider eklendi kadar başlangıçta benim için işe yaramadı EC2 bağlanmak için verilen örnek . Benim (basitlik için Groovy yazılmış) çalıştı basit bir örnek:

@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

Sadece benim için bir not olarak, bağlandığım bir dahili linux örneği için bu biçimi kullandım. Ihtiyacım olan anahtar ekleme Security.addProvider (new org.bouncycastle.jce.provider.BouncyCastleProvider()); hat. –