You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:12:01