Mensaje de error
Error(InvalidKeyFormat)
También se muestra como
- called `Result::unwrap()` on an `Err` value: Error(InvalidKeyFormat)
- InvalidKeyFormat
`{:?}` imprime `Error(InvalidKeyFormat)` y `{}` imprime `InvalidKeyFormat`.
jsonwebtoken (Rust crate) — ErrorKind::InvalidKeyFormat from EncodingKey::from_ec_pem / DecodingKey::from_*_pem
Qué significa
El PEM que pasas a un constructor de `EncodingKey`/`DecodingKey` no tiene la estructura que acepta ese constructor. Para claves privadas EC, `from_ec_pem` exige PKCS#8 (`-----BEGIN PRIVATE KEY-----`) y rechaza la forma SEC 1 (`-----BEGIN EC PRIVATE KEY-----`) que escribe `openssl ecparam -genkey`; además, cada uno de los cargadores RSA, EC y Ed25519 rechaza las claves de las otras familias.
Por qué ocurre
Clave privada EC en formato SEC 1
frecuente`openssl ecparam -genkey` y muchas herramientas más antiguas escriben `EC PRIVATE KEY`. El cargador EC del crate espera PKCS#8.
Cargador de otra familia de claves
frecuenteUna clave EC pasada a `from_rsa_pem`, una clave RSA a `from_ec_pem` o una clave Ed25519 a cualquiera de los dos. Elige el cargador según el algoritmo de la clave.
Ni siquiera es un PEM
ocasionalUna cadena JSON de JWK, un archivo DER, un certificado donde se espera una clave o un PEM con `\n` escapados procedente de la configuración.
Cómo solucionarlo
- 1.
Convertir la clave privada a PKCS#8
Un solo comando de OpenSSL convierte las claves privadas SEC 1 o PKCS#1 a PKCS#8, que leen todas las bibliotecas modernas.
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 el cargador que corresponde a la clave
Cada familia de algoritmos tiene su propio constructor; para las JWK, usa `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