如何使用Paramiko将RSAKey序列化为可被RSAKey(data=raw_key)接收的原始字符串
解决方法
首先明确核心点:paramiko.rsakey.RSAKey(data=xxx)接口接收的data参数,是ASN.1 DER编码的原始RSA私钥二进制数据,不是带BEGIN/END标记的PEM格式文本。你之前报错信息里出现的-----BEGIN RSA PRIVATE KEY-----头就是PEM格式的典型标记,这也是write_private_key导出的内容无法直接传入该接口的根本原因。
直接从RSAKey实例持有的底层私钥对象导出对应格式的二进制数据即可,paramiko 2.4+版本底层依赖cryptography库做密码学运算,不需要额外安装依赖,代码如下:
from cryptography.hazmat.primitives import serialization import paramiko # 导出可直接传入RSAKey(data=)的原始私钥字节 raw_key_data = rsa_key.key.private_bytes( encoding=serialization.Encoding.DER, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption() ) # 验证:导出的内容可以直接初始化RSAKey实例 valid_key = paramiko.rsakey.RSAKey(data=raw_key_data)
注意事项
- 如果你最初传入
RSAKey(data=)的是字符串类型而非字节类型,根据你之前使用的编码规则对raw_key_data做对应解码即可,不要额外做Base64转码,DER本身是未编码的原始二进制格式。 - 不要尝试手动解析
write_private_key导出的PEM内容来提取DER数据,这种方式多了不必要的编解码步骤,容易引入格式错误。
内容的提问来源于stack exchange,提问作者Björn Pollex
相关产品推荐
相关产品推荐

