You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust rsa crate调用from_public_key_pem解析PEM公钥报Pem(Label)错误

错误原因

报错Asn1(Error { kind: Pem(Label), position: None })的核心原因是传入的PEM字符串格式不符合解析要求:你从TCP接收得到的public_pem中,换行是字面量的\n字符组合(反斜杠+字母n),而非Rust字符串中代表ASCII换行的\n转义字符(0x0A)。
PEM解析器识别标签时,会从-----BEGIN PUBLIC KEY-----开始读取,直到遇到第一个换行符判定标签结束。由于字符串中没有真实换行,解析器会把后续的Base64内容也当成标签的一部分,无法匹配到合法的PEM标签,最终抛出Label类型错误。
你提供的PEM内容本身是合法的2048位RSA PKCS#8公钥,不存在密钥格式本身的问题。

修复方案

按以下步骤处理即可正确导入公钥:

  • 先对TCP接收得到的原始PEM字符串做预处理,将所有字面量\n替换为真实的ASCII换行符
  • 预处理完成后trim掉字符串首尾的多余空白、不可见控制字符,避免传输过程中夹带的冗余字符干扰解析
  • 确保已导入rsa::pkcs8::DecodePublicKey trait,否则from_public_key_pem方法无法正常调用

参考实现代码:

use rsa::pkcs8::DecodePublicKey;
use rsa::RsaPublicKey;

fn import_tcp_pubkey(raw_pem: &str) -> Result<RsaPublicKey, Box<dyn std::error::Error>> {
    // 替换字面量\n为真实换行,清除首尾冗余字符
    let fixed_pem = raw_pem.replace("\\n", "\n").trim().to_owned();
    let pubkey = RsaPublicKey::from_public_key_pem(&fixed_pem)?;
    Ok(pubkey)
}

#[test]
fn test_import() {
    let raw_from_tcp = "-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo4gBUOV0d9DMzor8aM3b\\n82clrpEhoTaXBLpizioiEsNJF/xxNE9mzQkmJ1GCzToTJCHBFz7SzOCFEHjSpGfh\\noz1I6zGQF5jSwNDOqbbMYeA77VqwV8iCIWXqn1aQ5ZCnOUQ0a3OqZ/aSwW2YE01X\\nfXEAHzTEzplzM2Kh5t3WxjKMwtwRmJsFZBMJch206EkSGMpwJGaXstZXeVYlh5wZ\\nLVX+XMAdtpeH16S5jBxW/OsJFbU6szTdtbzjA0bp73WhidT7IUOp4IQJHte7+TIU\\nWfcyFnDfQCTiLmGaQQuqscZ/Q2FAAKCFhpN41/usYrL/q18kf2zkmtGFEb+pLrhd\\nawIDAQAB\\n-----END PUBLIC KEY-----";
    let key = import_tcp_pubkey(raw_from_tcp).unwrap();
    assert_eq!(key.size(), 256); // 2048位密钥对应256字节长度
}

注意:不要直接对TCP接收的原始字节解析结果调用unwrap(),建议对PEM解析的Result做错误处理,避免异常输入导致程序panic。

内容的提问来源于stack exchange,提问作者YungOne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:36:37