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

求助解决OpenSSL错误error:0906D06C:PEM routines:PEM_read_bio:no start

排查OpenSSL错误:error:0906D06C:PEM routines:PEM_read_bio:no start

这个错误本质是OpenSSL在解析PEM格式数据时,找不到预期的起始边界标记(比如-----BEGIN PUBLIC KEY-----),咱们一步步来排查和解决:

1. 先确认你的PEM公钥文件本身没问题

首先检查C:/rsa-stuff/public.pem是不是标准的PEM格式:

  • 打开文件看开头是不是-----BEGIN PUBLIC KEY-----,结尾是不是-----END PUBLIC KEY-----,中间是连续的Base64编码内容,没有多余的空格、乱码或者截断。
  • 用OpenSSL命令行验证文件有效性:
    openssl rsa -pubin -in C:/rsa-stuff/public.pem -text -noout
    
    如果命令报错,说明文件本身格式错误,需要重新生成正确的PEM公钥(比如从DER格式转换,或者重新生成密钥对)。

2. 修正代码里的逻辑混乱

看你的代码,你先调用cWrapper.getPublicKey()拿到了RSA*类型的公钥对象,但在encryptRSA()里又去处理publicKeyStr,这明显逻辑重复了:

  • 如果getPublicKey()已经正确把PEM文件解析成了RSA*,那encryptRSA()直接用这个指针调用RSA_public_encrypt即可,完全不需要再重新构建BIO解析公钥。
  • 如果getPublicKey()的实现有问题,那得先修正它的读取逻辑,示例代码如下:
    RSA* getPublicKey(const QString& filePath) {
        QFile file(filePath);
        if (!file.open(QIODevice::ReadOnly)) {
            qDebug() << "Failed to open public key file";
            return nullptr;
        }
        QByteArray keyData = file.readAll();
        BIO* bio = BIO_new_mem_buf(keyData.constData(), keyData.size());
        if (!bio) {
            qDebug() << "Failed to create BIO object";
            return nullptr;
        }
        // 解析PEM格式的公钥到RSA对象
        RSA* rsa = PEM_read_bio_RSA_PUBKEY(bio, nullptr, nullptr, nullptr);
        BIO_free(bio); // 记得释放BIO资源
        return rsa;
    }
    

3. 补全截断的BIO标记代码

你的代码里BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_明显没写完,这个宏应该是BIO_FLAGS_BASE64_NO_NL,用来告诉OpenSSL忽略Base64数据中的换行符,避免解析时出错。补全后应该是:

BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);

4. 检查公钥数据的完整性

你用qDebug() << publicKeyStr;输出的内容,一定要确认是不是完整的PEM内容——包括开头和结尾的-----BEGIN/END PUBLIC KEY-----标记,没有被截断或者丢失。如果输出的内容不完整,那说明你读取公钥数据的过程有问题(比如文件读取不完整,或者数据传递时被截断)。

按照上面的步骤逐一排查,应该就能解决这个PEM解析错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:20:05