I am writing a client application in Windows that establishes an SSL connection with a server, and the server requests a client certificate for authentication. The server provides me with a .pfx file, then I use the openssl command-line tool to get the certificate and private key as follows:
openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem openssl pkcs12 -in filename.pfx -nocerts -out key.pem
after that I try to download the certificate and private key with functions from openssl, as shown below, but SSL_CTX_use_PrivateKey_file() always fails, error message " error:0906D06C:PEM routines:PEM_read_bio:no start line ", I canβt understand why, can someone give me some enlightenment? Here is the code.
#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; };
source share