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

エラーメッセージ

KeyRejected("InvalidEncoding")

別の表記

  • KeyRejected("WrongAlgorithm")
  • called `Result::unwrap()` on an `Err` value: KeyRejected("InvalidEncoding")

理由の文字列は、`InvalidEncoding`、`WrongAlgorithm`、`InconsistentComponents`、`TooSmall` などさまざまです。`Display` は理由だけを出力します(例:`InvalidEncoding`)。

ring (Rust crate) — ring::error::KeyRejected from EcdsaKeyPair::from_pkcs8 / Ed25519KeyPair::from_pkcs8

このエラーの意味

ring は秘密鍵のバイト列を拒否しました。ring が受け付けるエンコーディングは鍵の種類ごとに 1 つだけで、ECDSA と Ed25519 では DER エンコードされた PKCS#8(v1 または v2)、RSA ではそれに加えて `from_der` 経由の PKCS#1 DER です。報告されるのは短い理由だけで、バイト列がその構造でなければ `InvalidEncoding`、別のアルゴリズムや曲線用の有効な PKCS#8 ドキュメントであれば `WrongAlgorithm` になります。ring が PEM を自分で解析することはありません。

発生する理由

修正方法

  1. 1.

    PEM をデコードしてラベルを確認する

    PEM パーサーを使い、ラベルが `PRIVATE KEY` であることを必須にして、デコードした内容を 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. 2.

    古い鍵ファイルを PKCS#8 DER に変換する

    OpenSSL で SEC 1 や PKCS#1 の秘密鍵を PKCS#8 に変換できます。`-outform DER` を指定すると、ring が想定するとおりのバイト列が出力されます。

    bash
    openssl pkcs8 -topk8 -nocrypt -in ec-sec1.pem -outform DER -out key.pk8   # SEC 1 -> PKCS#8 DER

関連するエラー

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