跳到主要内容
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 命令即可把 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

相关错误

浏览完整的签名错误库