2012-02-14 14 views
6

Tengo un archivo pem que se parece al de las pruebas SSHJ (aunque no veo que se haga referencia a él): https://github.com/shikhar/sshj/blob/master/src/test/resources/hostkey.pem. Simplemente tratando de autenticar a través del archivo pem a una instancia EC2 (leer como cadena), pero teniendo problemas. ¿Alguien hizo esto?SSHJ - Inicio de sesión de Keypair a la instancia 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"); 

error es el siguiente:

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: Todavía no hay suerte. ¿Debe estar haciendo algo mal con la clave privada que AWS genera para iniciar sesión?

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

está agregando el verificador clave de host después de llamar a connect(), que tiene que recorrer antes de que la verificación ocurre durante la conexión – shikhar

+0

En el final De hecho, me pareció mejor usar JSch. Aquí hay un ejemplo del uso de esta biblioteca: http://stackoverflow.com/questions/16626612/keypair-login-to-ec2-instance-with-jsch – Scott

Respuesta

2

No es la autenticación de usuario que está disparo, que es la verificación de clave de host :)

Algo así como client.addHostKeyVerifier ("xx: 0a: xx: B5: C2: fd: 44: 1d: e0: e4: fc: xx: 5f: f8: dd: f6 ") antes de conectar.

+0

Veo :) Genial, lo probaré y volveré a ¡tú! –

+0

De hecho, estoy teniendo un gran problema con esto. Agregar esa línea no me ayuda. Debo estar haciendo algo mal con la clave privada RSA que genera EC2 para los grupos de seguridad? '' ' \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 final Session session = ssh.startSession(); \t \t session.exec ("echo -e \" test \ ">>/home/ubuntu/testfile"); '' ' –

2

he conectado con éxito a una instancia de Amazon EC2 utilizando la siguiente:

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

El ejemplo dado para la conexión a EC2 no tenía, inicialmente, trabajar para mí hasta que he añadido el BouncyCastleProvider a la clase java.security.Security . El ejemplo simple que trabajó para mí (escrita en Groovy para simplificar) es:

@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

Al igual que una nota para mí, utilicé este mismo formato para una instancia interna de Linux a la que me estaba conectando. La adición clave que necesitaba era Security.addProvider (new org.bouncycastle.jce.provider.BouncyCastleProvider()); línea. –

Cuestiones relacionadas