エラーメッセージ
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 を自分で解析することはありません。
発生する理由
PEM のテキストをバイト列として渡している
よくある`include_bytes!("key.pem")` や `fs::read("key.pem")` で得られるのは PEM のテキストです。ring には、その中身を base64 デコードした DER が必要です。
PKCS#8 ではなく SEC 1 や PKCS#1
よくある`EC PRIVATE KEY` や `RSA PRIVATE KEY` のファイルは別の構造です。ring の ECDSA と Ed25519 の鍵ペアは、PKCS#8 しか読み込みません。
別のアルゴリズムや曲線の鍵
ときどきP-384 の鍵を P-256 の署名アルゴリズムで読み込んだ場合や、ECDSA 鍵を `Ed25519KeyPair` に渡した場合は、`WrongAlgorithm` になります。
修正方法
- 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.
古い鍵ファイルを 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