2010-09-10 15 views
7

Qualcuno può darmi un esempio di autenticazione della chiave privata/pubblica in sshj?ssh esempio di autenticazione della chiave privata/pubblica

In sshj qual è la linea di comando equivalente,

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

ho provato (errore manipolazione omesso),

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

ma nelle dichiarazioni di registro vedo,

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 

Grazie, Everett

+0

ho risposto una domanda simile [qui] (http://stackoverflow.com/a/15800383/311525) con un esempio il collegamento ad un'AWS istanza con un file .pem fornito. Non era così semplice come avrei sperato. – Scott

risposta

0

Prova utilizzando KeyPairWrapper come questo:

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

Con il provider BouncyCastle si può usare qualcosa di simile per estrarre una coppia di chiavi da un PKCS8 PEM (scuse per il codice disordinato)

/** 
* 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

è necessario includere la lib di BouncyCastle per la maggior parte dei tipi di chiave. Ecco la dipendenza Maven: org.bouncycastle bcprov-jdk16 1,46

Problemi correlati