参见英文答案 > SSHJ Example of Public Key Auth from File 1个
任何人都可以在 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
谢谢,
埃弗雷特
尝试使用KeyPairWrapper,如下所示:
KeyPair kp = ... // read keypair from file ssh.authPublickey(user, new KeyPairWrapper(keypair));
使用BouncyCastle提供程序,您可以使用类似的东西从PKCS8 PEM中提取KeyPair(为凌乱的代码道歉)
/** * 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"); }
翻译自:https://stackoverflow.com/questions/3686710/ssh-example-of-private-public-key-authentication