繁体   English   中英

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

[英]How to load openssh private key using cryptography python module?

如果我使用来自 cryptography.hazmat.primitives.serialization 的 load_pem_private_key,我收到 ValueError("Could not deserialize key data.")

要添加更多上下文:

我的钥匙开始于

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

引发此错误的代码段

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

错误的回溯显示 backend=default_backend()) -> 在 load_pem_private_key 中返回 backend.load_pem_private_key(data, password) -> password,在 load_pem_private_key -> self._handle_key_loading_error() 中的 _load_key

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以上,尽管Windows和Unix的UI有所不同,puttygen也可以这样做。

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

从密码学 3.0 版( 2020 年 7 月 20日发布) 开始,您现在可以使用load_private_ssl_key()函数加载以OPENSSH PRIVATE KEY PEM 格式存储的 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

您可以使用ssh extra 将bcrypt作为依赖项引入:

pip install cryptography[ssh]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM