Mensaje de error
KeyRejected("InvalidEncoding")
También se muestra como
- KeyRejected("WrongAlgorithm")
- called `Result::unwrap()` on an `Err` value: KeyRejected("InvalidEncoding")
La cadena del motivo varía: `InvalidEncoding`, `WrongAlgorithm`, `InconsistentComponents`, `TooSmall`… `Display` solo imprime el motivo, por ejemplo, `InvalidEncoding`.
ring (Rust crate) — ring::error::KeyRejected from EcdsaKeyPair::from_pkcs8 / Ed25519KeyPair::from_pkcs8
Qué significa
ring rechazó los bytes de la clave privada. ring acepta exactamente una codificación por tipo de clave —PKCS#8 codificado en DER (v1 o v2) para ECDSA y Ed25519 y, para RSA, también PKCS#1 DER mediante `from_der`— y solo indica un motivo breve: `InvalidEncoding` cuando los bytes no tienen esa estructura y `WrongAlgorithm` cuando son un documento PKCS#8 válido de otro algoritmo o curva. ring nunca analiza PEM por sí mismo.
Por qué ocurre
Texto PEM pasado como bytes
frecuente`include_bytes!("key.pem")` o `fs::read("key.pem")` devuelven el texto PEM. ring necesita el DER que contiene, ya decodificado de base64.
SEC 1 o PKCS#1 en lugar de PKCS#8
frecuenteLos archivos `EC PRIVATE KEY` y `RSA PRIVATE KEY` tienen otras estructuras. En ring, los pares de claves ECDSA y Ed25519 solo cargan PKCS#8.
Una clave de otro algoritmo o curva
ocasionalUna clave P-384 cargada con el algoritmo de firma P-256 o una clave ECDSA pasada a `Ed25519KeyPair` producen `WrongAlgorithm`.
Cómo solucionarlo
- 1.
Decodificar el PEM y comprobar su etiqueta
Usa un analizador de PEM, exige la etiqueta `PRIVATE KEY` y pasa a ring el contenido decodificado.
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 los archivos de clave heredados a PKCS#8 DER
OpenSSL convierte las claves privadas SEC 1 y PKCS#1 a PKCS#8; `-outform DER` escribe exactamente los bytes que espera ring.
bash openssl pkcs8 -topk8 -nocrypt -in ec-sec1.pem -outform DER -out key.pk8 # SEC 1 -> PKCS#8 DER