本文へスキップ
ecdsa.com
jsonwebtoken (Rust crate)Rust

エラーメッセージ

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 のローダーは、それぞれほかのファミリーの鍵も拒否します。

発生する理由

修正方法

  1. 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. 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

関連するエラー

署名エラーデータベースをすべて見る