2010-09-10 11 views
7

¿Alguien me puede dar un ejemplo de autenticación de clave privada/pública en sshj?ssh ejemplo de autenticación de clave privada/pública

En SSHJ ¿cuál es la línea de comandos equivalente,

ssh -i /path/to/mykey.private [email protected] 

Probé (manejo de errores omite),

final SSHClient ssh = new SSHClient(); 
ssh.loadKnownHosts(); 
ssh.connect("host"); 
ssh.authPublickey("username", "/path/to/mykey.private"); 
final Session session = ssh.startSession(); 
... 

pero en las declaraciones de registro que veo,

DEBUG net.schmizz.sshj.SSHClient - Attempting to load key from: /path/to/mykey.private 
WARN net.schmizz.sshj.SSHClient - Could not load keys due to: {} 
net.schmizz.sshj.common.SSHException: No provider available forUnknown key file 
    at net.schmizz.sshj.SSHClient.loadKeys(SSHClient.java:482) ~[sshj-0.3.0.jar:na] 
... 
Exception in thread "main" 10:49:55.943 [reader] DEBUG 
net.schmizz.sshj.transport.Reader - Stopping 
net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods 

Gracias, Everett

+0

respondí una pregunta similar [aquí] (http://stackoverflow.com/a/15800383/311525) con un ejemplo de conexión a una EMA instancia con un archivo .pem que proporcionan. No fue tan sencillo como esperaba. – Scott

Respuesta

0

Trate de usar KeyPairWrapper así:

KeyPair kp = ... // read keypair from file 
ssh.authPublickey(user, new KeyPairWrapper(keypair)); 

Con el proveedor BouncyCastle se puede usar algo como esto para extraer un par de llaves de una PKCS8 PEM (disculpas por el código desordenado)

/** 
* Takes a PEM-encoded PKCS8 key-containing InputStream and returns the KeyPair within. Only the first keypair is considered 
* 
* @return 
* @throws IOException if the stream is not a valid PKCS8 wrapped keypair 
*/ 
public static KeyPair readKeypair(final InputStream is, final char[] password) throws IOException { 
    PasswordFinder passwordFinder = password != null ? new StaticPasswordFinder(password) : null; 

    KeyPair kp = null; 
    try { 
     // read the stream as a PEM encoded 
     try { 

      final PEMReader pem = new PEMReader(new InputStreamReader(is), passwordFinder); 
      try { 
       // Skip over entries in the file which are not KeyPairs 
       do { 
        final Object o = pem.readObject(); 

        if (o == null) 
         break; // at end of file 
        else if (o instanceof KeyPair) 
         kp = (KeyPair) o; 
       } while (kp == null); 
      } 
      finally { 
       pem.close(); 
      } 
     } 
     catch (EncryptionException e) { 
      throw new IOException("Error reading PEM stream: " + e.getMessage(), e); 
     } 
    } 
    finally { 
     is.close(); 
    } 

    // Cast the return to a KeyPair (or, if there is no [valid] return, throw an exception) 
    if (kp != null) 
     return kp; 
    else 
     throw new IOException("Stream " + is + " did not contain a PKCS8 KeyPair"); 
} 
0

usted necesita incluye BouncyCastle lib para la mayoría de los tipos de teclas. Aquí está la dependencia Maven: org.bouncycastle bcprov-jdk16 1,46

Cuestiones relacionadas