Сообщение об ошибке
Password was not given but private key is encrypted
Бывает и зеркальный случай: «Password was given but private key is not encrypted.» — тот же вызов, обратное несоответствие (оба воспроизведены на cryptography 50.0).
Python cryptography — TypeError from load_pem_private_key
Что это означает
Вы вызвали load_pem_private_key(data, password=None) для зашифрованного закрытого ключа: в его PEM указано ENCRYPTED PRIVATE KEY или есть заголовки Proc-Type: 4,ENCRYPTED. Библиотека видит оболочку шифрования и не пытается угадывать: ей нужна парольная фраза в виде байтов или действительно незашифрованный ключ.
Почему это происходит
Ключ создан с парольной фразой, а код её не ожидает
частоЗашифрованные ключи получаются при использовании openssl genpkey/ec с -aes256, ssh-keygen с парольной фразой, а также в пакетах, которые выдаёт CA. Код развёртывания, написанный для незашифрованных ключей, передаёт password=None и останавливается на этой ошибке.
Пароль есть, но передаётся неправильно
частоПустой пароль считается отсутствующим: код, который при незаданной переменной окружения подставляет b"", получает именно это сообщение. Параметр должен иметь тип bytes (со str вызов завершается ошибкой «Cannot convert … instance to a buffer»), а в пароле, прочитанном из переменной окружения, может оказаться завершающий перевод строки, из-за которого расшифрование завершается ошибкой «Incorrect password, could not decrypt key».
Выбран не тот файл ключа
иногдаВместо ключа развёртывания, который намеренно оставили незашифрованным, подхватилась зашифрованная резервная копия (key.pem.enc, id_ecdsa с парольной фразой).
Как исправить
- 1.
Передайте парольную фразу в виде байтов
Получайте пароль из хранилища секретов, кодируйте его в байты и на всякий случай обрезайте пробельные символы по краям.
python import os from cryptography.hazmat.primitives.serialization import load_pem_private_key password = os.environ["KEY_PASSPHRASE"].strip().encode() key = load_pem_private_key(pem_bytes, password=password) - 2.
Или расшифруйте ключ один раз, при подготовке окружения
Если среда выполнения не умеет работать с парольной фразой, храните ключ незашифрованным в полноценном менеджере секретов: зашифрованный ключ, пароль от которого лежит в том же env-файле, не даёт никакой защиты. А если парольная фраза когда-либо хранилась в репозитории рядом с ключом, смените ключ: в этом случае шифрование было лишь украшением.
bash openssl pkey -in encrypted.pem -out plain.pem # (prompts once for the passphrase; protect plain.pem via the secret store)