エラーメッセージ
Error(InvalidKeyFormat)
別の表記
- called `Result::unwrap()` on an `Err` value: Error(InvalidKeyFormat)
- InvalidKeyFormat
`{:?}` は `Error(InvalidKeyFormat)` を、`{}` は `InvalidKeyFormat` を出力します。
jsonwebtoken (Rust crate) — ErrorKind::InvalidKeyFormat from EncodingKey::from_ec_pem / DecodingKey::from_*_pem
このエラーの意味
`EncodingKey`/`DecodingKey` のコンストラクターに渡した PEM が、そのコンストラクターが受け付ける構造ではありません。EC の秘密鍵の場合、`from_ec_pem` は PKCS#8(`-----BEGIN PRIVATE KEY-----`)を要求し、`openssl ecparam -genkey` が出力する SEC 1 形式(`-----BEGIN EC PRIVATE KEY-----`)を拒否します。また、RSA、EC、Ed25519 のローダーは、それぞれほかのファミリーの鍵も拒否します。
発生する理由
SEC 1 形式の EC 秘密鍵
よくある`openssl ecparam -genkey` や多くの古いツールは `EC PRIVATE KEY` を出力します。このクレートの EC ローダーは PKCS#8 を想定しています。
別の鍵ファミリー用のローダー
よくあるEC 鍵を `from_rsa_pem` に、RSA 鍵を `from_ec_pem` に、または Ed25519 鍵をそのどちらかに渡しているケースです。鍵のアルゴリズムに応じてローダーを選んでください。
そもそも PEM ではない
ときどきJWK の JSON 文字列、DER ファイル、鍵が必要な場所に渡された証明書、または設定から読み込まれ、`\n` がエスケープされた PEM です。
修正方法
- 1.
秘密鍵を PKCS#8 に変換する
OpenSSL のコマンド 1 つで、SEC 1 や PKCS#1 の秘密鍵を、最新のライブラリならどれでも読み込める PKCS#8 に変換できます。
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.
鍵に合ったローダーを使う
アルゴリズムのファミリーごとに専用のコンストラクターがあります。JWK には `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