SSL_CTX_use_PrivateKey_file() a échoué
Je suis en train d'écrire une application client sur Windows qui établit une connexion SSL pour un serveur, et le serveur demande de certificat du client pour l'authentification. Le serveur me donne une .fichier pfx, puis-je utiliser openssl outil de ligne de commande pour obtenir le certificat et la clé privée comme ceci:
openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in filename.pfx -nocerts -out key.pem
après cela, j'essaie de charger le certificat et la clé privée avec des fonctions d'openssl comme ci-dessous, mais SSL_CTX_use_PrivateKey_file()
toujours échoué, le message d'erreur est "error:0906D06C:PEM routines:PEM_read_bio:no start line
", je ne peux pas comprendre pourquoi, quelqu'un peut-il me donner quelques lumières?
Voici le 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;
};
Vous devez vous connecter pour publier un commentaire.
Dans mon cas, l'erreur est parce que le fichier PEM ne pas contenir à la fois une clé et un certificat.
Assurez-vous que votre fichier contient deux sections:
Je concaténée
.key
et.crt
fichiers que j'ai déjà eu dans ma configuration d'Apache pour faire un.pem
fichier.Le "pas de ligne de départ' erreur est certainement trompeur, car vous pouvez avoir une très bonne "COMMENCER" ligne dans votre fichier PEM et obtenez toujours l'erreur.
L'erreur
error:0906D06C:PEM routines:PEM_read_bio:no start line
est parce que dans les deux cert.pem ainsi que les principaux.pem, ne pas commencer avec-----BEGIN CERTIFICATE-----
et-----BEGIN ENCRYPTED PRIVATE KEY-----
.Si vous ouvrez votre cert.pem et de la clé.pem dans un éditeur de texte et de le tirer hors de ce qui est là avant la
BEGIN
marqueurs, vous devriez être bon.Lorsque vous créez un certificat et d'une paire de clés à l'aide de Demande de Signature de Certificat, vous ne recevez pas cette information supplémentaire.
J'ai résolu ce problème moi-même. J'ai généré la clé.pem à l'aide d'OpenSSL pour Windows, lorsque la CMD me demande de taper la phrase de passe, j'ai juste tapé un Entrer car je n'ai pas besoin d'une phrase de passe, mais la clé.pem était pas valide(ni
BEGIN
niEND
marqueurs). Lorsque je génère la clé privée dans Linux, les messages du terminal je doit taper un mot de passe et je ne. Puis-je retirer la clé de mot de passe à l'aide de cette commande:openssl rsa -in key.pem -out newkey.pem
Après, j'ai ouvert la clé.pem dans un éditeur de texte, ça commence avec
-----BEGIN RSA PRIVATE KEY-----
et jusqu'à la fin avec-----END RSA PRIVATE KEY-----
. Et SSL_CTX_use_PrivateKey_file() fonctionne très bien!Sous openssl répertoire demo/openssl il y a un client exemple.
Changement:
dans votre cas:
Essayez cet exemple et de voir où il échoue.
Êtes-vous sûr que la clé de mot de passe est 123456 ?