我正在 Windows 上编写一个与服务器建立 SSL 连接的客户端应用程序,并且服务器请求客户端证书进行身份验证。服务器为我提供了一个 .pfx 文件,然后我使用 openssl 命令行工具获取证书和私钥,如下所示:
openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in filename.pfx -nocerts -out key.pem
之后,我尝试使用以下openssl的功能加载证书和私钥,但SSL_CTX_use_PrivateKey_file()总是失败,错误消息是“ error:0906D06C:PEM routines:PEM_read_bio:no start line”,我不知道为什么,谁能给我一些启示?这是代码。
#include "openssl/ssl.h"
#include "openssl/err.h"
#include <stdio.h>
#include <string>
int InitClientCtx()
{
    OpenSSL_add_ssl_algorithms();
    SSL_CTX* m_pClientCtx;
    m_pClientCtx = SSL_CTX_new(SSLv23_method());
    if(!m_pClientCtx)
    {
        return -1;
    }
    ::SSL_CTX_set_options(m_pClientCtx, SSL_OP_ALL);  //for well-known bugs
    int nRet = 0;
    std::string sCertFilePath = "C:\\cert.pem";
    nRet = SSL_CTX_use_certificate_chain_file(m_pClientCtx, sCertFilePath.c_str());
    std::string sKeyPassWord = "123456";
    SSL_CTX_set_default_passwd_cb_userdata(m_pClientCtx, (void*)(sKeyPassWord.c_str()));
    std::string sKeyFilePath = "C:\\key.pem";
    // this method returned 0, which means it failed.
    nRet = SSL_CTX_use_PrivateKey_file(m_pClientCtx, sKeyFilePath.c_str(), SSL_FILETYPE_PEM);
    SSL_load_error_strings();
    unsigned long n = ERR_get_error();
    char buf[1024];
    printf("%s\n", ERR_error_string(n, buf));
    nRet = SSL_CTX_check_private_key(m_pClientCtx);
    if (nRet <= 0)
    {
        return -1;
    }
    /*std::string sCACertFilePath;
    nRet = SSL_CTX_load_verify_locations(m_pClientCtx, sCACertFilePath.c_str(), NULL);*/
    return 0;
}
int main()
{
    InitClientCtx();
    return 0;
};