错误信息
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`。该 crate 的 EC 加载函数要求的是 PKCS#8。
其他算法族的加载函数
常见把 EC 密钥传给了 `from_rsa_pem`、把 RSA 密钥传给了 `from_ec_pem`,或者把 Ed25519 密钥传给了两者中的任意一个。应根据密钥的算法选择加载函数。
根本不是 PEM
偶见JWK JSON 字符串、DER 文件、在需要密钥的地方传入的证书,或者来自配置、带有转义 `\n` 的 PEM。
修复方法
- 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.
使用与密钥匹配的加载函数
每个算法族都有自己的构造函数;对于 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