【问题标题】:How to load openssh private key using cryptography python module?如何使用密码学 python 模块加载 openssh 私钥?
【发布时间】:2019-11-25 09:30:50
【问题描述】:

如果我使用来自 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(数据,密码) -> 密码,在 load_pem_private_key -> self._handle_key_loading_error() in _load_key

【问题讨论】:

  • 你先把私钥转成PKCS#8格式了吗?没有输入/输出,或者至少没有创建私钥的方法,真的不可能回答这个问题。
  • 密码库不支持新的 OpenSSH 格式,但我认为 pycryptodome 支持...您可以将其加载到 pycryptodome 并保存为 pem/der 吗?

标签: cryptography python


【解决方案1】:

pyca/cryptography 主要使用 OpenSSL,而 for private key supports mostly the formats OpenSSL supports 不包括 OpenSSH 的“新”格式。然而,它确实添加了 OpenSSH public key 格式,因此询问他们关于添加 OpenSSH private 的问题可能并不荒谬。在此期间...

假设您拥有 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 也可以执行此操作,尽管 UI 在 Windows 和 Unix 之间有所不同。

骗子:
SSH key generated by ssh-keygen is not recognized by Paramiko: "not a valid RSA private key file"(Paramiko 是 Python 中的 SSH)
"Invalid privatekey" when using JSch(Java,但同样的问题)

【讨论】:

  • 我正在寻找某种方法来为我使用 python 加密模块本身,而不是使用 ssh-keygen。
  • @reddynishanth 你有没有在 Python 中找到任何方法来做到这一点?
  • 是的,RSA.importKey 来自 Crypto.PublicKey 模块
【解决方案2】:

从密码学版本 3.0(发布 2020-07-20,您现在可以使用 load_private_ssl_key() function 加载以 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 module(版本 3.1.5 或更高版本);不幸的是,文档没有明确说明这一点,但是如果没有安装bcrypt,您收到的错误消息相当清楚:

cryptography.exceptions.UnsupportedAlgorithm: Need bcrypt module

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

pip install cryptography[ssh]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2012-11-15
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多