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格式,绕开旧接口调用逻辑:
- 执行转换命令,替换命令里的路径为你实际的私钥路径,转换过程如果原私钥设置了密码,按提示输入即可:
openssl pkey -in ~/.ssh/你的原私钥文件 -out ~/.ssh/转换后新私钥文件
- 给新私钥设置正确的权限,否则SSH会因权限过宽拒绝读取:
chmod 600 ~/.ssh/转换后新私钥文件
- 连接时指定使用新生成的私钥文件即可,原私钥建议备份留存不要删除。
方案3:临时开启OpenSSL旧版兼容(应急使用,不推荐长期开启)
如果既没法升级gem也不方便转换私钥,可以临时开启OpenSSL 3.0的legacy兼容模块,允许旧接口调用:
- 先安装OpenSSL 3的兼容依赖:
sudo apt update && sudo apt install -y libssl3
- 编辑系统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
- 保存退出后重新执行Ruby连接脚本即可,注意这个方案会降低系统OpenSSL的安全基线,仅适合临时调试使用。
验证方法
修复后可以执行一段简单的测试代码验证连通性:
require 'net/ssh' Net::SSH.start('你的服务器IP', 'root', keys: ['你的私钥路径']) do |ssh| puts ssh.exec!('whoami') end
正常输出root即代表修复完成。
内容的提问来源于stack exchange,提问作者user9114945
相关产品推荐
相关产品推荐

