如何用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
相关产品推荐
相关产品推荐

