Сообщение об ошибке
Incorrect password, could not decrypt key
Также выводится как
- ValueError: Incorrect password, could not decrypt key
- Bad decrypt. Incorrect password?
Формулировка по релизам (проверено на каждом): 45.0 и новее — «Incorrect password, could not decrypt key»; 43–44 сообщают о неверном пароле как «Could not deserialize key data… the provided password may be incorrect…»; 42 и более ранние — «Bad decrypt. Incorrect password?».
Python cryptography — ValueError from load_pem_private_key / load_der_private_key / pkcs12.load_key_and_certificates
Что это означает
Ключ зашифрован, и cryptography попыталась расшифровать его переданным паролем, но расшифрование не удалось. В зашифрованных закрытых ключах нет «подсказки для пароля»: единственный признак — то, что расшифрованные байты не образуют корректный ключ, поэтому эта ошибка всегда означает, что переданные байты не совпадают с парольной фразой, которая использовалась при шифровании.
Почему это происходит
Перевод строки в конце стал частью пароля
частоПарольные фразы, сохранённые командой `echo secret > file`, в секретах Kubernetes, созданных из файлов, или в файлах `.env`, часто заканчиваются на `\n`. Если прочитать файл как есть, передаётся на один байт больше.
Парольная фраза от другого ключа
частоНесколько ключей и несколько парольных фраз в одном хранилище секретов или ключ, перешифрованный при ротации, тогда как приложение осталось со старой парольной фразой.
Парольная фраза с символами вне ASCII закодирована по-другому
иногдаИнструмент, которым шифровали ключ, мог закодировать парольную фразу с символами вне ASCII в Latin-1 или UTF-16, а ваш код кодирует её в UTF-8. Символы совпадают, байты — нет.
Файлы PKCS#12 из старых инструментов
иногдаНекоторые устаревшие средства экспорта в `.p12` по-разному обрабатывают пустой пароль (нет пароля или пустая строка). Осознанно попробуйте `None` и `b""`, а не подбирайте другие значения.
Как исправить
- 1.
Считывайте парольную фразу байт в байт
Удаляйте только символы конца строки и никогда не трогайте другие пробельные символы; от источника до функции загрузки передавайте парольную фразу в виде байтов.
python from pathlib import Path passphrase = Path("/run/secrets/key_passphrase").read_bytes().rstrip(b"\r\n") key = serialization.load_pem_private_key(pem, password=passphrase) - 2.
Проверьте парольную фразу вне кода
Если OpenSSL принимает парольную фразу, набранную вручную, а ваш код выдаёт ошибку, разница в том, как код её считывает (перевод строки, кодировка). Если OpenSSL тоже выдаёт ошибку, парольная фраза просто неверна.
bash # Prompts for the passphrase; "bad decrypt" means the passphrase is wrong, not the file openssl pkey -in encrypted.pem -noout && echo "passphrase OK" printf '%s' "$KEY_PASSPHRASE" | wc -c # length without a trailing newline