Message d’erreur
KeyRejected("InvalidEncoding")
Également affiché sous la forme
- KeyRejected("WrongAlgorithm")
- called `Result::unwrap()` on an `Err` value: KeyRejected("InvalidEncoding")
La chaîne du motif varie : `InvalidEncoding`, `WrongAlgorithm`, `InconsistentComponents`, `TooSmall`… `Display` n’affiche que le motif, par exemple `InvalidEncoding`.
ring (Rust crate) — ring::error::KeyRejected from EcdsaKeyPair::from_pkcs8 / Ed25519KeyPair::from_pkcs8
Ce que cela signifie
ring a refusé les octets de la clé privée. ring accepte exactement un encodage par type de clé (PKCS#8 encodé en DER, v1 ou v2, pour ECDSA et Ed25519, et pour RSA également PKCS#1 DER via `from_der`) et ne donne qu’un motif succinct : `InvalidEncoding` lorsque les octets n’ont pas cette structure, `WrongAlgorithm` lorsqu’il s’agit d’un document PKCS#8 valide pour un autre algorithme ou une autre courbe. ring n’analyse jamais lui-même le PEM.
Pourquoi cela se produit
Texte PEM passé sous forme d’octets
fréquente`include_bytes!("key.pem")` ou `fs::read("key.pem")` donne le texte PEM. ring a besoin du DER qu’il contient, une fois décodé du base64.
SEC 1 ou PKCS#1 au lieu de PKCS#8
fréquenteLes fichiers `EC PRIVATE KEY` et `RSA PRIVATE KEY` ont d’autres structures. Dans ring, les paires de clés ECDSA et Ed25519 ne se chargent qu’à partir de PKCS#8.
Une clé d’un autre algorithme ou d’une autre courbe
occasionnelleUne clé P-384 chargée avec l’algorithme de signature P-256, ou une clé ECDSA passée à `Ed25519KeyPair`, donne `WrongAlgorithm`.
Comment corriger l’erreur
- 1.
Décoder le PEM et vérifier son étiquette
Utilisez un analyseur PEM, exigez l’étiquette `PRIVATE KEY` et passez le contenu décodé à ring.
rust // Cargo.toml: pem = "3" let pem = pem::parse(std::fs::read_to_string("key.pem")?)?; anyhow::ensure!(pem.tag() == "PRIVATE KEY", "expected PKCS#8, got {}", pem.tag()); let key_pair = EcdsaKeyPair::from_pkcs8(&ECDSA_P256_SHA256_FIXED_SIGNING, pem.contents(), &rng) .map_err(|e| anyhow::anyhow!("key rejected: {e}"))?; - 2.
Convertir les anciens fichiers de clés en PKCS#8 DER
OpenSSL convertit les clés privées SEC 1 et PKCS#1 en PKCS#8 ; `-outform DER` écrit exactement les octets qu’attend ring.
bash openssl pkcs8 -topk8 -nocrypt -in ec-sec1.pem -outform DER -out key.pk8 # SEC 1 -> PKCS#8 DER