C++ 错误:0906D06C:PEM例程:PEM_read_bio:无启动

C++ 错误:0906D06C:PEM例程:PEM_read_bio:无启动,c++,windows,qt,openssl,C++,Windows,Qt,Openssl,得到这个非常恼人的错误错误:0906D06C:PEM例程:PEM_read_bio:无启动 代码: 在encryptRSA()中: 当我打印publicKeyStr时,看起来很好。这是已启用所有字符的记事本++视图: 有人知道我做错了什么吗?超级烦人的问题:( 首先,这不是问题,因为我没有得到可信任的部分。无论如何,我尝试了所有的“解决方案”它们都不起作用,同样的错误。您的RSA公钥是SubjectPublicKeyInfo PEM格式,但您尝试使用PEM_read_bio_rsPublicK

得到这个非常恼人的错误<代码>错误:0906D06C:PEM例程:PEM_read_bio:无启动

代码:

在encryptRSA()中:

当我打印publicKeyStr时,看起来很好。这是已启用所有字符的记事本++视图:

有人知道我做错了什么吗?超级烦人的问题:(


首先,这不是问题,因为我没有得到可信任的部分。无论如何,我尝试了所有的“解决方案”它们都不起作用,同样的错误。

您的RSA公钥是SubjectPublicKeyInfo PEM格式,但您尝试使用
PEM_read_bio_rsPublicKey
读取它,它尝试读取PKCS#1格式的PEM RSA密钥。请尝试改用
PEM_read_bio_RSA_PUBKEY


我在移植的openSSL1.1.0f上遇到了相同的错误。从mqtt客户端连接读取根证书时,错误出现在我的日志中,直到我发现我已将ERR_put_error()直接转发到日志中,而在openssl中,则是“真实的”错误处理保存在ERR_状态错误缓冲区中,因此有时(如本例中),错误是“预期的”,并且ERR_状态错误缓冲区被清除(在任何人检查之前)

在crypto/pem/pem_info.c第65行:

i = PEM_read_bio(bp, &name, &header, &data, &len);
    if (i == 0) {
        error = ERR_GET_REASON(ERR_peek_last_error());
        if (error == PEM_R_NO_START_LINE) {
            ERR_clear_error();
            break;
        }
        goto err;
也就是说,它通过BIO进入PEM_read_BIO,直到它返回零,如果你得到这个PEM_R_NO_START_行,那么这只是一种表示它完成的方式

不过,到那时,错误已经落在我的日志程序中。因此,如果有人对他或她直接从ERR_put_error转发的错误感到困惑,请在错误处理例程中使用
ERR_print_errors_fp(stderr);
。在我的情况下,由于我没有stderr,我制作了一个补丁版本,如:

    void errorhandling()
    {
        unsigned long l;
        char buf[256];
        const char *file, *data;
        int line, flags;

        while ((l = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0)
        {
            ERR_error_string_n(l, buf, sizeof buf);
            printf("%s:%s:%d:%s\n", buf, file, line, (flags & ERR_TXT_STRING) ? data : "");
        }
    }

重复的可能重复的@S.M.不,这些解决方案都不起作用,甚至没有相同的错误…这回答了你的问题吗?
QByteArray data;
QFile file(filename);

if(!file.open(QFile::ReadOnly))
{
    printf("Error reading file: %s\n", file.errorString());
    return data;
}

data = file.readAll();
file.close();
return data;
i = PEM_read_bio(bp, &name, &header, &data, &len);
    if (i == 0) {
        error = ERR_GET_REASON(ERR_peek_last_error());
        if (error == PEM_R_NO_START_LINE) {
            ERR_clear_error();
            break;
        }
        goto err;
    void errorhandling()
    {
        unsigned long l;
        char buf[256];
        const char *file, *data;
        int line, flags;

        while ((l = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0)
        {
            ERR_error_string_n(l, buf, sizeof buf);
            printf("%s:%s:%d:%s\n", buf, file, line, (flags & ERR_TXT_STRING) ? data : "");
        }
    }