Fehlermeldung
KeyRejected("InvalidEncoding")
Auch ausgegeben als
- KeyRejected("WrongAlgorithm")
- called `Result::unwrap()` on an `Err` value: KeyRejected("InvalidEncoding")
Der Grund variiert: `InvalidEncoding`, `WrongAlgorithm`, `InconsistentComponents`, `TooSmall` … `Display` gibt nur den Grund aus, zum Beispiel `InvalidEncoding`.
ring (Rust crate) — ring::error::KeyRejected from EcdsaKeyPair::from_pkcs8 / Ed25519KeyPair::from_pkcs8
Was der Fehler bedeutet
ring hat die Bytes des privaten Schlüssels abgelehnt. ring akzeptiert pro Schlüsseltyp genau eine Kodierung – DER-kodiertes PKCS#8 (v1 oder v2) für ECDSA und Ed25519, bei RSA zusätzlich PKCS#1 als DER über `from_der` – und meldet nur einen kurzen Grund: `InvalidEncoding`, wenn die Bytes nicht diese Struktur haben, `WrongAlgorithm`, wenn sie ein gültiges PKCS#8-Dokument für einen anderen Algorithmus oder eine andere Kurve sind. PEM parst ring nie selbst.
Warum der Fehler auftritt
PEM-Text als Bytes übergeben
häufig`include_bytes!("key.pem")` oder `fs::read("key.pem")` liefert den PEM-Text. ring braucht das darin enthaltene, base64-dekodierte DER.
SEC 1 oder PKCS#1 statt PKCS#8
häufigDateien mit `EC PRIVATE KEY` und `RSA PRIVATE KEY` haben andere Strukturen. Schlüsselpaare für ECDSA und Ed25519 lädt ring nur aus PKCS#8.
Ein Schlüssel eines anderen Algorithmus oder einer anderen Kurve
gelegentlichEin P-384-Schlüssel, der mit dem Signaturalgorithmus für P-256 geladen wird, oder ein ECDSA-Schlüssel, der an `Ed25519KeyPair` übergeben wird, ergibt `WrongAlgorithm`.
So behebst du den Fehler
- 1.
PEM dekodieren und sein Label prüfen
Verwende einen PEM-Parser, bestehe auf dem Label `PRIVATE KEY` und übergib den dekodierten Inhalt an 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.
Veraltete Schlüsseldateien in PKCS#8 (DER) konvertieren
OpenSSL konvertiert private Schlüssel im Format SEC 1 und PKCS#1 in PKCS#8; `-outform DER` schreibt genau die Bytes, die ring erwartet.
bash openssl pkcs8 -topk8 -nocrypt -in ec-sec1.pem -outform DER -out key.pk8 # SEC 1 -> PKCS#8 DER