[英]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.