Перейти к содержимому
ecdsa.com
Python cryptographyPython: пакет cryptography

Сообщение об ошибке

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».

Почему это происходит

Как исправить

  1. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей