使用Apache Mina及公私钥对连接SSH服务器的配置问题咨询
Apache Mina SshClient RSA私钥认证实现方案
前置依赖
确保引入的Apache Mina SSHD版本为2.7.0及以上,低版本对RSA SHA-2签名算法的支持存在兼容性问题。
核心实现步骤
- 第一步:加载本地RSA私钥文件
直接读取~/.ssh/id_rsa文件,使用Mina内置的SecurityUtils和PEMResourceParser完成私钥解析,不需要额外引入第三方密钥解析库。 - 第二步:为SshClient配置密钥身份认证提供器
将解析得到的私钥对注入KeyIdentityProvider,注册到SshClient的会话配置中。 - 第三步:建立连接时指定认证用户名,Mina会自动匹配服务端已存储的公钥完成认证。
完整可运行代码示例
import org.apache.sshd.client.SshClient; import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier; import org.apache.sshd.client.session.ClientSession; import org.apache.sshd.common.config.keys.FilePasswordProvider; import org.apache.sshd.common.config.keys.loader.pem.PEMResourceParser; import org.apache.sshd.common.keyprovider.KeyIdentityProvider; import java.nio.file.Paths; import java.security.KeyPair; import java.util.Collections; public class SshRsaAuthDemo { public static void main(String[] args) throws Exception { // 1. 初始化SshClient try (SshClient client = SshClient.setUpDefaultClient()) { // 生产环境请替换为严格的服务端密钥校验逻辑,此处仅为演示 client.setServerKeyVerifier(AcceptAllServerKeyVerifier.INSTANCE); client.start(); // 2. 加载本地RSA私钥,若私钥有设置密码,修改FilePasswordProvider的返回值即可 KeyPair rsaKeyPair = PEMResourceParser.loadKeyPairs( Paths.get(System.getProperty("user.home"), ".ssh", "id_rsa"), FilePasswordProvider.of("你的私钥密码,无密码则传空字符串") ).iterator().next(); // 3. 配置密钥身份认证提供器 client.setKeyIdentityProvider(KeyIdentityProvider.wrap(Collections.singletonList(rsaKeyPair))); // 4. 建立连接并完成认证 try (ClientSession session = client.connect("你的SSH用户名", "目标服务器IP", 22) .verify(5000) .getSession()) { session.auth().verify(3000); System.out.println("认证成功,已连接到目标SSH服务器"); // 此处可继续执行后续命令、SFTP等操作 } client.stop(); } } }
常见问题排查
- 如果出现
No key exchange methods available报错,手动添加RSA相关的密钥交换算法到客户端配置:client.setKeyExchangeFactories(NamedFactory.setUpTransformedFactories( false, BuiltinKeyExchange.VALUES, ClientBuilder.DH2KEX )); - 如果私钥是OpenSSH新格式(开头为
BEGIN OPENSSH PRIVATE KEY),需要确保你使用的Mina版本 >= 2.6.0,旧版本不支持该格式的RSA私钥解析,也可以用ssh-keygen -p -m PEM -f ~/.ssh/id_rsa命令将私钥转为传统PEM格式。
内容的提问来源于stack exchange,提问作者Homewrecker
相关产品推荐
相关产品推荐

