2012-09-06 8 views
0

J'ai écrit du code avec openssl pour connecter le serveur sous tls. Si je charge des certificats à partir du fichier pem, cela fonctionne correctement. Mais si je charge le certificat du fichier pfx, il se produit SSL_ERROR_SSL en appelant SSL_connect. Je ne sais pas si le processus de chargement du fichier pfx est faux ou non. Le processus est ci-dessous.SSL_ERROR__SSL se produit lors de l'appel SSL_connect

FILE* fp = fopen("cert.pfx", "rb"); 
PKCS12* p12 = d2i_PKCS12_fp(fp, NULL); 
PKCS12_parse(p12, NULL, &private_key, &certificate, &ca_certificates); 
SSL_CTX_use_certificate(ctx, certificate); 
SSL_CTX_use_PrivateKey(ctx, private_key); 
SSL_CTX_check_private_key(ctx); 
SSL_CTX_add_extra_chain_cert(ctx, sk_X509_value(ca_certificates, i); 
SSL_CTX_add_client_CA(ctx, sk_X509_value(ca_certificates, i); 
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); 
... 
SSL* ssl = SSL_new(ssl_context); 
SSL_set_fd(ssl, sockfd); 
SSL_connect(ssl); 
... 

J'ai testé le fichier pfx avec un autre client. Ça marche bien. Donc le problème n'est pas le fichier pfx. Y at-il des options de openssl échouerait la connexion? Ou je n'ai pas défini le certificat d'autorité de certification correctement? Le fichier pfx contient des CA signés par moi-même. Mais cela fonctionne avec d'autres clients.

J'ai appelé ERR_get_error() après l'échec de SSL_connect(). Et la vérification du certificat a échoué. Donc, je pense qu'il y a quelque chose de mal dans le processus ci-dessus de chargement d'un fichier pfx. Peut-être que je n'ajoute pas le certificat CA à juste titre. Quelqu'un peut-il me dire le bon processus pour charger un pfx.

Aidez s'il vous plaît!

Répondre

0

Votre variable i est-elle un compteur de taille sk_num(ca_certificates)? Si c'est le cas, essayez de supprimer la ligne SSL_CTX_add_client_CA que je pense ne convient pas pour les clients (pas sûr, difficile).

également, dans votre gestion des erreurs, placez les lignes suivantes pour trouver la raison:

SSL_load_error_strings(); // just once 
char msg[1024]; 
ERR_error_string_n(ERR_get_error(), err_msg, sizeof(err_msg)); 
printf("%s\n", msg);` 

Ou, aussi, vous pouvez essayer d'obtenir l'erreur SSL directement:

int ssl_error = SSL_get_verify_result(ssl); 

Le résultat int peut être vérifié dans ce page

+0

J'ai trouvé la solution. Ce code est pour l'utilisation du client. J'ai regardé dans la source de la fonction SSL_CTX_load_verify_locations(). Il ajoute le certificat ca au cert_store du contexte SSL par la fonction X509_STORE_add_cert(). J'ai fait la même chose et j'ai travaillé. Alors merci pour votre aide. – geeker

1

J'ai découvert, que l'ordre dans lequel les certificats sont ajoutés en utilisant SSL_CTX_add_extra_chain_cert est important. L'oder dans lequel les certs sont ajoutés par PKCS12_parse doit avoir changé de libssl 0.9.8 à libssl1.0. C'est pourquoi je suis passé à les ajouter au cert-store en utilisant le code ci-dessous.

X509_STORE * certStore = SSL_CTX_get_cert_store(ctx); 
for(int i = 0; i < sk_X509_num(ca) ; i++) 
{ 
    if (X509_STORE_add_cert(certStore, sk_X509_value(ca_certificates, i))==0) 
    { 
     ERR_print_errors_fp (stderr); 
    } 
} 
Questions connexes