Skip to main content

通过创建rsa格式的私钥以及服务端启用rsa认证解决jsch连接ssh失败的问题

· 3 min read
orange
programmer on jvm platform

服务建立ssh连接失败, 问题定位为jsch不支持openssh格式的私钥.
OpenSSH 7.8及之后的版本, ssh-keygen命令默认生成的私钥格式为openssh.
该格式的头部为-----BEGIN OPENSSH PRIVATE KEY-----.

在将私钥转换为rsa格式后, 发现服务端还需要启用rsa认证, 在启用rsa认证后问题解决.

下面将详细介绍如何生成rsa格式的私钥以及服务端启用rsa认证.

生成rsa格式的私钥

服务建立ssh链接失败, 日志如下

Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@e4487af
at com.jcraft.jsch.KeyPair.load(KeyPair.java:664)
at com.jcraft.jsch.KeyPair.load(KeyPair.java:561)
at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:407)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:367)

在查阅了相关问题后, 发现jsch不支持openssh格式的私钥, 需要将私钥转换为rsa格式.

通过以下命令生成rsa格式的私钥

ssh-keygen -t rsa -b 4096 -m PEM

后续会提示输入私钥的文件名, 以及私钥的密码, 一般直接回车即可.

服务端启用rsa认证

note

OpenSSH 8.8及之后的版本默认禁用rsa认证, 需要手动启用, 可以通过ssh -V查看sshd版本

在生成了rsa格式的私钥后, 通过ssh连接服务端, 发现连接失败, 查看sshd日志发现如下错误

journalctl -t sshd -f

该命令输出如下内容

May 05 18:05:00 orange sshd[289365]: userauth_pubkey: signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
May 05 18:05:00 orange sshd[289365]: error: Received disconnect from 127.0.0.1 port 55904:3: com.jcraft.jsch.JSchException: Auth fail [preauth]
May 05 18:05:00 orange sshd[289365]: Disconnected from authenticating user fastone 127.0.0.1 port 55904 [preauth]

上述日志中的signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]说明sshd不支持ssh-rsa算法.

为了解决这个问题, 我们需要编辑/etc/ssh/sshd_config并增加以下内容

/etc/ssh/sshd_config
PubkeyAcceptedAlgorithms +ssh-rsa

编辑完成后重启sshd服务

sudo systemctl restart sshd

参考资料