Mensagem de erro
Password was given but private key is not encrypted.
Também aparece como
- TypeError: Password was given but private key is not encrypted.
Python cryptography — TypeError from load_pem_private_key / load_der_private_key
O que significa
Você passou um `password` para uma função de carregamento de chaves, mas a chave está armazenada sem criptografia. A biblioteca cryptography trata isso como erro de programação (`TypeError`) em vez de ignorar a senha, porque aceitá-la em silêncio esconderia um desvio de configuração — por exemplo, uma chave que alguém descriptografou e salvou em texto claro. É o caso inverso de “Password was not given but private key is encrypted”.
Por que acontece
A configuração da frase secreta sobreviveu à chave criptografada
comumA chave foi exportada de novo ou gerada novamente sem criptografia, mas a implantação ainda fornece a antiga variável da frase secreta. Rotações feitas por equipes diferentes costumam deixar essa divergência para trás.
Uma string vazia em vez de None
comum`password=b""` é uma senha. Um código que lê uma variável de ambiente não definida como `""` e a codifica passa uma senha vazia para uma chave não criptografada e recebe este erro.
A conversão removeu a criptografia
ocasional`openssl pkey -in enc.pem -out key.pem` (sem uma opção de cifra) ou `ssh-keygen -p` com uma nova frase secreta vazia grava a chave sem criptografia, enquanto o aplicativo ainda espera descriptografá-la.
Como corrigir
- 1.
Passar None para chaves não criptografadas
Normalize valores de configuração vazios para `None`. Se a política exige que as chaves fiquem criptografadas em repouso, trate este erro como sinal de que uma chave não criptografada foi implantada e, em vez disso, substitua a chave.
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.
Detectar a criptografia pelo próprio PEM
Chaves PKCS#8 criptografadas usam o rótulo `ENCRYPTED PRIVATE KEY`; chaves PEM legadas do OpenSSL trazem um cabeçalho `Proc-Type: 4,ENCRYPTED`. Use isso para decidir se é preciso pedir uma frase secreta.
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