Saltar al contenido
ecdsa.com
jsonwebtoken (Rust crate)Rust

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

Cómo solucionarlo

  1. 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. 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

Errores relacionados

Explorar toda la base de datos de errores de firma