Пример SSH аутентификации с закрытым / открытым ключом
Кто-нибудь может дать мне пример аутентификации с закрытым / открытым ключом в sshj?
В sshj что эквивалент командной строки,
ssh -i /path/to/mykey.private username@host
Я пытался (обработка ошибок опущена),
final SSHClient ssh = new SSHClient();
ssh.loadKnownHosts();
ssh.connect("host");
ssh.authPublickey("username", "/path/to/mykey.private");
final Session session = ssh.startSession();
...
но в отчетах журнала я вижу,
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
Спасибо эверетт
2 ответа
Вы должны включить BouncyCastle lib для большинства типов ключей. Вот зависимость Maven: org.bouncycastle bcprov-jdk16 1.46
Попробуйте использовать KeyPairWrapper
как это:
KeyPair kp = ... // read keypair from file
ssh.authPublickey(user, new KeyPairWrapper(keypair));
С поставщиком BouncyCastle вы можете использовать что-то вроде этого для извлечения KeyPair из PEM PKCS8 (извинения за грязный код)
/**
* 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");
}