У меня есть закрытый ключ, пример создания пары ключей RSA:
ssh-keygen -t rsa -N 123456 -f /tmp/rsa
Я могу заменить вызов:
ssh-keygen -p -P 123456 -N "" -f /tmp/rsa
используя модуль криптографии Python:
from cryptography.hazmat.backends import default_backend
import cryptography.hazmat.primitives.serialization as crypto_serialization
priv_key = crypto_serialization.load_pem_private_key(open(key_path, "rb").read(),
passphrase.encode('utf-8'),
default_backend()
)
with open(key_path, "wb") as dest_pem:
dest_pem.write(priv_key.private_bytes(crypto_serialization.Encoding.PEM,
crypto_serialization.PrivateFormat.TraditionalOpenSSL,
crypto_serialization.NoEncryption()
)
)
Но когда я генерирую ключ с параметром -t ed25519, я получаю сообщение об ошибке:
File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 16, in load_pem_private_key
return backend.load_pem_private_key(data, password)
File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1089, in load_pem_private_key
password,
File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1315, in _load_key
self._handle_key_loading_error()
File "/usr/local/lib64/python3.6/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1373, in _handle_key_loading_error
raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.
Я загружаю закрытый ключ Ed25519 с помощью модуля python paramiko, но не могу сериализовать закрытые байты:
import paramiko
key_priv = paramiko.Ed25519Key.from_private_key_file('ed25519', password=b'123456')
load_pem_private_key()
, но это неправильный метод. модуль шифрования имеет другую функцию для закрытых ключей SSH,load_ssh_private_key()
, который прекрасно работает как с ключами RSA, так и с ключами ed25519. - person President James K. Polk   schedule 15.02.2021ssh-keygen
, как вы утверждали. Кодssh-keygen -p -P...
изменяет парольную фразу с 123456 на пустую парольную фразу. Новый файл закрытого ключа по-прежнему зашифрован (с пустой парольной фразой) и по-прежнему имеет формат openssh. Ваш код Python, с другой стороны, преобразует зашифрованный файл закрытого ключа в формате openssh в незашифрованный файл закрытого ключа в формате PKCS1. Совершенно разные. - person President James K. Polk   schedule 15.02.2021