Mensagem de erro
Incorrect password, could not decrypt key
Também aparece como
- ValueError: Incorrect password, could not decrypt key
- Bad decrypt. Incorrect password?
Texto por versão (conferido em cada uma): 45.0 e posteriores, “Incorrect password, could not decrypt key”; 43 e 44 relatam uma senha errada como “Could not deserialize key data… the provided password may be incorrect…”; 42 e anteriores, “Bad decrypt. Incorrect password?”.
Python cryptography — ValueError from load_pem_private_key / load_der_private_key / pkcs12.load_key_and_certificates
O que significa
A chave está criptografada, e a biblioteca cryptography tentou descriptografá-la com a senha que você forneceu, mas a descriptografia falhou. Chaves privadas criptografadas não trazem nenhuma “dica de senha” — o único sinal é que os bytes descriptografados não formam uma chave válida —, por isso esta mensagem sempre significa que os bytes que você passou não são a frase secreta usada na criptografia.
Por que acontece
Uma quebra de linha no final faz parte da senha
comumFrases secretas gravadas com `echo secret > file`, em Secrets do Kubernetes criados a partir de arquivos ou em arquivos `.env` costumam terminar com `\n`. Ler o arquivo literalmente passa um byte a mais.
A frase secreta pertence a outra chave
comumVárias chaves e várias frases secretas no mesmo cofre de segredos, ou uma chave criptografada de novo durante a rotação enquanto o aplicativo continuou com a frase secreta antiga.
Frase secreta com caracteres não ASCII codificada de outra forma
ocasionalA ferramenta que criptografou a chave pode ter usado Latin-1 ou UTF-16 para uma frase secreta com caracteres não ASCII, enquanto seu código codifica em UTF-8. Os caracteres coincidem; os bytes, não.
Arquivos PKCS#12 de ferramentas antigas
ocasionalAlgumas exportações `.p12` legadas tratam a senha vazia de outra forma (nenhuma senha versus string vazia). Teste `None` e `b""` de forma deliberada em vez de tentar adivinhar outros valores.
Como corrigir
- 1.
Ler exatamente os bytes da frase secreta
Remova apenas as quebras de linha, nunca outros espaços em branco, e mantenha a frase secreta em bytes da origem até a função de carregamento.
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.
Confirmar a frase secreta fora do código
Se o OpenSSL aceita a frase secreta digitada à mão, mas seu código falha, a diferença está na forma como o código a lê (quebra de linha, codificação). Se o OpenSSL também falha, a frase secreta está simplesmente errada.
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