Mensagem de erro
Password was not given but private key is encrypted
O caso inverso também existe: “Password was given but private key is not encrypted.” — mesma chamada, divergência oposta (os dois reproduzidos na cryptography 50.0).
Python cryptography — TypeError from load_pem_private_key
O que significa
Você chamou load_pem_private_key(data, password=None) com uma chave privada criptografada — o PEM dela diz ENCRYPTED PRIVATE KEY ou traz cabeçalhos Proc-Type: 4,ENCRYPTED. A biblioteca enxerga o envelope de criptografia e se recusa a adivinhar: ela precisa da frase secreta em bytes ou de uma chave que realmente não esteja criptografada.
Por que acontece
Chave gerada com frase secreta, mas o código não espera nenhuma
comumO openssl genpkey/ec com -aes256, o ssh-keygen com frase secreta ou um bundle emitido por uma CA produzem chaves criptografadas. O código de implantação escrito para chaves não criptografadas então passa password=None e para aqui.
Senha disponível, mas passada de forma incorreta
comumUma senha vazia conta como nenhuma senha: um código que recorre a b"" quando a variável de ambiente não está definida recebe exatamente esta mensagem. O parâmetro precisa ser bytes — uma str falha com “Cannot convert … instance to a buffer” — e uma senha lida de uma variável de ambiente pode trazer uma quebra de linha no final, que faz a descriptografia falhar com “Incorrect password, could not decrypt key”.
Foi selecionado o arquivo de chave errado
ocasionalUma cópia de backup criptografada (key.pem.enc, id_ecdsa com frase secreta) carregada no lugar da chave de implantação, que foi deixada sem criptografia de propósito.
Como corrigir
- 1.
Fornecer a frase secreta em bytes
Obtenha a senha do cofre de segredos e passe-a codificada em bytes; por precaução, remova espaços em branco nas extremidades.
python import os from cryptography.hazmat.primitives.serialization import load_pem_private_key password = os.environ["KEY_PASSPHRASE"].strip().encode() key = load_pem_private_key(pem_bytes, password=password) - 2.
Ou descriptografar a chave uma única vez, no provisionamento
Se o ambiente de execução não consegue gerenciar uma frase secreta, guarde a chave sem criptografia em um gerenciador de segredos adequado — uma chave criptografada cuja senha está no mesmo arquivo env não acrescenta proteção nenhuma. E, se a frase secreta já tiver viajado junto com a chave em um repositório, rotacione a chave: nesse caso, a criptografia era só enfeite.
bash openssl pkey -in encrypted.pem -out plain.pem # (prompts once for the passphrase; protect plain.pem via the secret store)