Fehlermeldung
Error(InvalidKeyFormat)
Auch ausgegeben als
- called `Result::unwrap()` on an `Err` value: Error(InvalidKeyFormat)
- InvalidKeyFormat
`{:?}` gibt `Error(InvalidKeyFormat)` aus, `{}` gibt `InvalidKeyFormat` aus.
jsonwebtoken (Rust crate) — ErrorKind::InvalidKeyFormat from EncodingKey::from_ec_pem / DecodingKey::from_*_pem
Was der Fehler bedeutet
Das PEM, das du einem Konstruktor von `EncodingKey`/`DecodingKey` übergeben hast, hat nicht die Struktur, die dieser Konstruktor akzeptiert. Bei privaten Schlüsseln vom Typ EC verlangt `from_ec_pem` PKCS#8 (`-----BEGIN PRIVATE KEY-----`) und lehnt die Form SEC 1 (`-----BEGIN EC PRIVATE KEY-----`) ab, die `openssl ecparam -genkey` schreibt; die Loader für RSA, EC und Ed25519 lehnen außerdem jeweils die Schlüssel der anderen Familien ab.
Warum der Fehler auftritt
Privater Schlüssel vom Typ EC im Format SEC 1
häufig`openssl ecparam -genkey` und viele ältere Tools schreiben `EC PRIVATE KEY`. Der EC-Loader des Crates erwartet PKCS#8.
Loader einer anderen Schlüsselfamilie
häufigEin EC-Schlüssel, der an `from_rsa_pem` übergeben wird, ein RSA-Schlüssel an `from_ec_pem` oder ein Ed25519-Schlüssel an einen der beiden. Wähle den Loader nach dem Algorithmus des Schlüssels.
Überhaupt kein PEM
gelegentlichEin JWK als JSON-String, eine DER-Datei, ein Zertifikat, wo ein Schlüssel erwartet wird, oder ein PEM aus der Konfiguration mit maskierten `\n`.
So behebst du den Fehler
- 1.
Privaten Schlüssel in PKCS#8 konvertieren
Ein einziger OpenSSL-Befehl konvertiert private Schlüssel im Format SEC 1 oder PKCS#1 in PKCS#8, das jede moderne Bibliothek liest.
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.
Passenden Loader für den Schlüssel verwenden
Jede Algorithmusfamilie hat einen eigenen Konstruktor; verwende für JWKs `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