跳到主要内容
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` 标签;旧式 OpenSSL PEM 密钥带有 `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

相关错误

浏览完整的签名错误库