Mensagem de erro
Error(InvalidKeyFormat)
Também aparece como
- called `Result::unwrap()` on an `Err` value: Error(InvalidKeyFormat)
- InvalidKeyFormat
`{:?}` imprime `Error(InvalidKeyFormat)`, `{}` imprime `InvalidKeyFormat`.
jsonwebtoken (Rust crate) — ErrorKind::InvalidKeyFormat from EncodingKey::from_ec_pem / DecodingKey::from_*_pem
O que significa
O PEM que você passou a um construtor de `EncodingKey`/`DecodingKey` não tem a estrutura que esse construtor aceita. Para chaves privadas EC, `from_ec_pem` exige PKCS#8 (`-----BEGIN PRIVATE KEY-----`) e rejeita a forma SEC 1 (`-----BEGIN EC PRIVATE KEY-----`) que o `openssl ecparam -genkey` grava; além disso, os carregadores de RSA, EC e Ed25519 rejeitam chaves das outras famílias.
Por que acontece
Chave privada EC na forma SEC 1
comumO `openssl ecparam -genkey` e muitas ferramentas antigas gravam `EC PRIVATE KEY`. O carregador de EC do crate espera PKCS#8.
Carregador de outra família de chaves
comumUma chave EC passada a `from_rsa_pem`, uma chave RSA a `from_ec_pem` ou uma chave Ed25519 a qualquer um dos dois. Escolha o carregador pelo algoritmo da chave.
Nem é um PEM
ocasionalUma string JSON de JWK, um arquivo DER, um certificado onde se espera uma chave ou um PEM com `\n` escapados vindo da configuração.
Como corrigir
- 1.
Converter a chave privada para PKCS#8
Um único comando do OpenSSL converte chaves privadas SEC 1 ou PKCS#1 para PKCS#8, formato que toda biblioteca moderna lê.
bash # SEC 1 ("EC PRIVATE KEY") or PKCS#1 ("RSA PRIVATE KEY") -> PKCS#8 ("PRIVATE KEY") openssl pkcs8 -topk8 -nocrypt -in ec-sec1.pem -out ec-pkcs8.pem - 2.
Usar o carregador que corresponde à chave
Cada família de algoritmos tem o próprio construtor; para JWKs, use `DecodingKey::from_jwk`.
rust let encoding = EncodingKey::from_ec_pem(&std::fs::read("ec-pkcs8.pem")?)?; // ES256/ES384 let decoding = DecodingKey::from_ec_pem(&std::fs::read("ec-public.pem")?)?; // "PUBLIC KEY" let rsa = DecodingKey::from_rsa_pem(&std::fs::read("rsa-public.pem")?)?; // RS*/PS* let ed = DecodingKey::from_ed_pem(&std::fs::read("ed25519-public.pem")?)?; // EdDSA