簡體   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