求助解决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命令行验证文件有效性:
如果命令报错,说明文件本身格式错误,需要重新生成正确的PEM公钥(比如从DER格式转换,或者重新生成密钥对)。openssl rsa -pubin -in C:/rsa-stuff/public.pem -text -noout
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
相关产品推荐
相关产品推荐

