Сообщение об ошибке
Password was given but private key is not encrypted.
Также выводится как
- TypeError: Password was given but private key is not encrypted.
Python cryptography — TypeError from load_pem_private_key / load_der_private_key
Что это означает
Вы передали `password` в функцию загрузки ключа, но ключ хранится незашифрованным. Библиотека cryptography считает это ошибкой программирования (`TypeError`), а не игнорирует пароль: если бы она молча принимала его, это скрыло бы расхождение в конфигурации — например, ключ, который кто-то расшифровал и сохранил в открытом виде. Это зеркальное отражение ошибки «Password was not given but private key is encrypted».
Почему это происходит
Настройка с парольной фразой пережила зашифрованный ключ
частоКлюч заново экспортировали или сгенерировали без шифрования, но при развёртывании по-прежнему передаётся старая переменная с парольной фразой. Такое расхождение часто остаётся после ротаций, которые выполняют разные команды.
Пустая строка вместо None
часто`password=b""` — это пароль. Код, который читает незаданную переменную окружения как `""` и кодирует её, передаёт пустой пароль для незашифрованного ключа и получает эту ошибку.
Шифрование снято при преобразовании ключа
иногда`openssl pkey -in enc.pem -out key.pem` (без параметра шифра) или `ssh-keygen -p` с пустой новой парольной фразой записывают ключ незашифрованным, а приложение по-прежнему рассчитывает его расшифровать.
Как исправить
- 1.
Передавайте None для незашифрованных ключей
Приводите пустые значения конфигурации к `None`. Если по политике ключи должны храниться в зашифрованном виде, считайте эту ошибку сигналом, что развёрнут незашифрованный ключ, и вместо этого замените ключ.
python import os from cryptography.hazmat.primitives import serialization passphrase = os.environ.get("KEY_PASSPHRASE") or None # "" becomes None key = serialization.load_pem_private_key(pem, password=passphrase.encode() if passphrase else None) - 2.
Определяйте шифрование по самому PEM
Зашифрованные ключи PKCS#8 используют метку `ENCRYPTED PRIVATE KEY`, а в устаревших PEM-ключах OpenSSL есть заголовок `Proc-Type: 4,ENCRYPTED`. По этим признакам и решайте, запрашивать ли парольную фразу.
python def is_encrypted_pem(pem: bytes) -> bool: head = pem.lstrip()[:64] return head.startswith(b"-----BEGIN ENCRYPTED PRIVATE KEY-----") or b"Proc-Type: 4,ENCRYPTED" in pem