2010-09-10 8 views
7

Kann mir jemand ein Beispiel für die Authentifizierung mit privatem/öffentlichem Schlüssel in sshj geben?ssh Beispiel für Authentifizierung mit privatem/öffentlichem Schlüssel

sshj In dem, was die Befehlszeile Äquivalent ist,

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

Ich habe versucht (Fehler ausgelassen Handhabung),

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

aber in den Log-Anweisungen Ich sehe,

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 

Danke, Everett

+0

ich eine ähnliche Frage beantwortet [hier] (http://stackoverflow.com/a/15800383/311525) mit einem Beispiel zu einem AWS Verbindungs Instanz mit einer .pem-Datei, die sie bereitstellen. Es war nicht so geradlinig, wie ich es mir erhofft hatte. – Scott

Antwort

0

Versuchen KeyPairWrapper wie folgt aus:

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

Mit dem BouncyCastle Anbieter Sie so etwas wie diese verwenden können, ein Schlüsselpaar aus einem PKCS8 PEM (Entschuldigung für die unordentlichen Code)

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

Sie extrahieren müssen Fügen Sie BouncyCastle lib für die meisten Schlüsseltypen hinzu. Hier ist die Maven Abhängigkeit: org.bouncycastle bcprov-jdk16 1,46