OpenSSH 与 OpenSSL 中 ED25519 密钥的转换实践

在实际使用中,我们常会遇到这样一种情况:使用 OpenSSL 生成了 ED25519 密钥,但在配置 SSH、Git 或自动化系统时,却发现 OpenSSH 并不能直接识别其格式。这背后的原因并不复杂——OpenSSL 与 OpenSSH 虽然使用相同的算法,但密钥封装格式并不一致

OpenSSL 生成的 ED25519 密钥通常是基于 PKCS#8 或 PEM 的通用密钥表示,更偏向密码学工具链;而 OpenSSH 使用的是其自定义的密钥格式,专门为 SSH 协议服务。这就导致两者在“算法相同”的前提下,依然无法直接互通。

解决方式也很明确:通过中间格式进行转换。常见做法是先使用 OpenSSL 生成 ED25519 私钥,再借助 ssh-keygen 重新封装。例如,可以先将 OpenSSL 私钥导出为标准 PEM,再由 OpenSSH 读取并转换为 SSH 可用的私钥和公钥格式。整个过程中,密钥本身并不会发生变化,变化的只是外层描述方式。

需要注意的是,ED25519 私钥一旦泄露,几乎无法“补救”。因此在转换完成后,建议立即为 OpenSSH 私钥设置 passphrase,并妥善控制文件权限。同时,对于多设备或多用途场景,应为每个用途生成独立密钥,而不是反复转换和复用同一把私钥。


常见 ED25519 密钥转换命令示例

下面给出一组在实践中较为常的转换流程,便于在 OpenSSL 与 OpenSSH 之间协作使用。

1. 使用 OpenSSL 生成 ED25519 私钥

openssl genpkey -algorithm ed25519 -out ed25519-openssl.pem

此时生成的是 PKCS#8 / PEM 格式私钥,OpenSSL 可直接使用,但 OpenSSH 尚不能直接识别。

2. 通过 ssh-keygen 转换为 OpenSSH 私钥

ssh-keygen -p -m PEM -f ed25519-openssl.pem

该步骤会重新封装密钥,使其符合 OpenSSH 的内部格式(openssh-key-v1)。转换过程中不会改变密钥本身,仅改变存储结构。

3. 从私钥派生 OpenSSH 公钥

ssh-keygen -y -f ed25519-openssl.pem > ed25519-openssh.pub

生成的公钥即可直接用于 authorized_keys、Git 仓库或自动化系统。

4. 反向导出为 OpenSSL 可用格式(可选)

如果需要让 OpenSSL 或其他工具链再次使用该密钥,可执行:

ssh-keygen -p -m PEM -f ed25519-openssl.pem


OpenSSH 与 OpenSSL 中 ED25519 密钥的转换实践
https://lingxiii.icu/archives/openssh-yu-openssl-zhong-ed25519-mi-yao-de-zhuan-huan-shi-jian
作者
Lx
发布于
2026年02月08日
许可协议