Message d’erreur
Error(InvalidKeyFormat)
Également affiché sous la forme
- called `Result::unwrap()` on an `Err` value: Error(InvalidKeyFormat)
- InvalidKeyFormat
`{:?}` affiche `Error(InvalidKeyFormat)`, `{}` affiche `InvalidKeyFormat`.
jsonwebtoken (Rust crate) — ErrorKind::InvalidKeyFormat from EncodingKey::from_ec_pem / DecodingKey::from_*_pem
Ce que cela signifie
Le PEM que vous avez passé à un constructeur `EncodingKey`/`DecodingKey` n’a pas la structure que ce constructeur accepte. Pour les clés privées EC, `from_ec_pem` exige PKCS#8 (`-----BEGIN PRIVATE KEY-----`) et rejette la forme SEC 1 (`-----BEGIN EC PRIVATE KEY-----`) qu’écrit `openssl ecparam -genkey` ; les chargeurs RSA, EC et Ed25519 rejettent en outre chacun les clés des autres familles.
Pourquoi cela se produit
Clé privée EC sous forme SEC 1
fréquente`openssl ecparam -genkey` et de nombreux outils plus anciens écrivent `EC PRIVATE KEY`. Le chargeur EC de la crate attend du PKCS#8.
Chargeur d’une autre famille de clés
fréquenteUne clé EC passée à `from_rsa_pem`, une clé RSA à `from_ec_pem`, ou une clé Ed25519 à l’un ou l’autre. Choisissez le chargeur d’après l’algorithme de la clé.
Pas du tout un PEM
occasionnelleUne chaîne JSON JWK, un fichier DER, un certificat là où une clé est attendue, ou un PEM issu de la configuration avec des `\n` échappés.
Comment corriger l’erreur
- 1.
Convertir la clé privée en PKCS#8
Une seule commande OpenSSL convertit les clés privées SEC 1 ou PKCS#1 en PKCS#8, que toutes les bibliothèques modernes savent lire.
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.
Utiliser le chargeur adapté à la clé
Chaque famille d’algorithmes a son propre constructeur ; pour les JWK, utilisez `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