如何使用加密python模块加载openssh私钥?



如果我使用 cryptography.hazmat.primitives.serialization 中的load_pem_private_key,我会收到 ValueError("无法反序列化密钥数据。

要添加更多上下文,请执行以下操作:

我的密钥以

-----BEGIN OPENSSH PRIVATE KEY-----

引发此错误的代码段

key = serialization.load_pem_private_key(data=private_key.encode(),
password=None,
backend=default_backend())

错误的回溯显示

后端=default_backend((( -> 返回 backend.load_pem_private_key(数据、密码(load_pem_private_key ->密码,以load_pem_private_key为单位 -> self._handle_key_loading_error(( 在_load_key

从加密版本 3.0(2020-07-20 发布(开始,您现在可以使用load_ssh_private_key()函数加载以OPENSSH PRIVATE KEYPEM 格式存储的 SSH 私钥:

$ ssh-keygen -t ed25519 -f demo_keypair -N 'example-passphrase' -C ''
$ python -c '
from cryptography.hazmat.primitives.serialization import load_ssh_private_key
from hashlib import sha1
key = load_ssh_private_key(open("demo_keypair", "rb").read(), b"example-passphrase")
print(sha1(key.sign(b"demo data")).hexdigest())
'
df551fcad0a0e288f0f92ca9e4876eb57a483c27

请注意,要加载密码保护密钥,您必须安装bcrypt模块(版本 3.1.5 或更高版本(;不幸的是,文档没有明确说明这一点,但如果未安装bcrypt,您收到的错误消息相当清晰:

cryptography.exceptions.UnsupportedAlgorithm: Need bcrypt module

您可以使用额外的sshbcrypt作为依赖项拉入:

pip install cryptography[ssh]

pyca/cryptography主要使用OpenSSL,对于私钥,主要支持OpenSSL支持的格式,不包括OpenSSH的"新"格式。但是,它确实添加了OpenSSH公钥格式,因此询问他们有关添加OpenSSH私钥的信息可能并不荒谬。在此期间...

鉴于您有OpenSSH,您可以使用ssh-keygen将OpenSSH"新"格式转换回OpenSSH的"旧"格式,即OpenSSL的"传统"或"遗留"格式,方法是声称您要更改密码 - 即使您使新密码与旧密码相同,或者因为您显然想要未加密的文件, 将新密码设置为空,就像旧密码一样:

# OpenSSH 7.8 up 
ssh-keygen -f keyfile -p -m pem 
# below 7.8 
ssh-keygen -f keyfile -p # NOT -o 

或者如果你有PuTTY 0.69,puttygen也可以做到这一点,尽管Windows和Unix之间的UI有所不同。

欺骗:
由 ssh-keygen 生成的 SSH 密钥无法被 Paramiko 识别:"不是有效的 RSA 私钥文件"(Paramiko 是 Python 中的 SSH(使用 JSch 时"私钥无效"(Java ,但同样的问题(

最新更新