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

如何用Python3将OpenSSL格式Ed25519私钥转换为SSH兼容格式?

解决方案:将OpenSSL生成的Ed25519 PKCS8密钥转换为OpenSSH格式

问题原因

你之前的代码错误在于直接将PKCS8格式私钥的Base64解码字节传入ed25519.Ed25519PrivateKey.from_private_bytes()——这个方法需要的是原始32字节Ed25519私钥,而OpenSSL生成的BEGIN PRIVATE KEY格式是PKCS8标准的ASN.1结构,包含了算法标识等额外信息,总长度远大于32字节,因此触发长度错误。

正确实现代码

使用cryptography库直接加载PKCS8格式的PEM密钥,再序列化为OpenSSH兼容格式:

私钥转换

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend

# 读取OpenSSL生成的PKCS8私钥文件
with open("openssl_private.key", "rb") as key_file:
    pkcs8_private_key = key_file.read()

# 加载私钥(如果私钥加密,需传入password参数,如password=b"your_passphrase")
private_key = serialization.load_pem_private_key(
    pkcs8_private_key,
    password=None,
    backend=default_backend()
)

# 序列化为OpenSSH格式私钥
openssh_private = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.OpenSSH,
    encryption_algorithm=serialization.NoEncryption()
)

# 保存为SSH可用的私钥文件(通常命名为id_ed25519)
with open("id_ed25519", "wb") as out_file:
    out_file.write(openssh_private)

公钥转换(可选)

如果需要同时转换公钥:

# 读取OpenSSL生成的公钥文件
with open("openssl_public.key", "rb") as key_file:
    pkcs8_public_key = key_file.read()

# 加载公钥
public_key = serialization.load_pem_public_key(
    pkcs8_public_key,
    backend=default_backend()
)

# 序列化为OpenSSH格式公钥
openssh_public = public_key.public_bytes(
    encoding=serialization.Encoding.OpenSSH,
    format=serialization.PublicFormat.OpenSSH
)

# 保存为SSH公钥文件(通常命名为id_ed25519.pub)
with open("id_ed25519.pub", "wb") as out_file:
    out_file.write(openssh_public)

关键说明

  • load_pem_private_key会自动解析PKCS8格式的ASN.1结构,提取出正确的Ed25519私钥对象,无需手动处理Base64解码或字节截取。
  • 若你的私钥设置了加密密码,在加载时必须传入password参数(字节类型)。
  • 转换后的私钥文件需设置正确权限(如chmod 600 id_ed25519),否则SSH会拒绝使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:47:09