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

Ubuntu 22/OpenSSL 3下Net/SSH 7.0.1私钥连接报错如何解决

问题原因

这个报错是net-ssh 7.0.1 版本原生不兼容 OpenSSL 3.0 导致的:该版本的RSA密钥加载逻辑调用了OpenSSL 3.0中被标记为不兼容的rsa#set_key=旧接口,加载传统格式PEM私钥时就会触发异常,密码认证因为不涉及私钥加载流程所以不受影响。

修复方案

按优先级从高到低选择以下任意一种方案即可:

方案1:升级net-ssh版本(最推荐,无安全风险)

net-ssh从7.1.0版本开始正式加入了OpenSSL 3.0兼容适配,直接升级到最新稳定版即可解决问题,升级后原有连接代码不需要做任何修改:

  • 全局gem环境直接执行升级命令:
gem install net-ssh -v '~> 7.2'
  • 如果是Bundler管理的项目,修改项目下的Gemfile,将net-ssh的版本约束调整为:
gem 'net-ssh', '~> 7.2'

之后执行bundle install完成升级即可。

方案2:转换私钥格式(无法升级gem时使用)

如果受项目依赖限制暂时无法升级net-ssh,可以将原有传统格式的RSA PEM私钥转换为OpenSSL 3.0原生支持的PKCS#8格式,绕开旧接口调用逻辑:

  1. 执行转换命令,替换命令里的路径为你实际的私钥路径,转换过程如果原私钥设置了密码,按提示输入即可:
openssl pkey -in ~/.ssh/你的原私钥文件 -out ~/.ssh/转换后新私钥文件
  1. 给新私钥设置正确的权限,否则SSH会因权限过宽拒绝读取:
chmod 600 ~/.ssh/转换后新私钥文件
  1. 连接时指定使用新生成的私钥文件即可,原私钥建议备份留存不要删除。

方案3:临时开启OpenSSL旧版兼容(应急使用,不推荐长期开启)

如果既没法升级gem也不方便转换私钥,可以临时开启OpenSSL 3.0的legacy兼容模块,允许旧接口调用:

  1. 先安装OpenSSL 3的兼容依赖:
sudo apt update && sudo apt install -y libssl3
  1. 编辑系统OpenSSL配置文件/etc/ssl/openssl.cnf,在文件最顶部添加以下配置:
openssl_conf = openssl_init

[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1
  1. 保存退出后重新执行Ruby连接脚本即可,注意这个方案会降低系统OpenSSL的安全基线,仅适合临时调试使用。
验证方法

修复后可以执行一段简单的测试代码验证连通性:

require 'net/ssh'
Net::SSH.start('你的服务器IP', 'root', keys: ['你的私钥路径']) do |ssh|
  puts ssh.exec!('whoami')
end

正常输出root即代表修复完成。

内容的提问来源于stack exchange,提问作者user9114945

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:54:20