2016-12-08 2 views
0

Je suis débutant. J'ai un problème lors de l'utilisation de SSL. Je trouve un code c sur internet. dans le code serveur, une fonction de suivi:SSL_get_peer_certificate (ssl) return NULL?

void ShowCerts(SSL* ssl) 
{ X509 *cert; 
    char *line; 

    cert = SSL_get_peer_certificate(ssl); /* Get certificates (if available) */ 
    if (cert != NULL) 
    { 
     printf("Server certificates:\n"); 
     line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); 
     printf("Subject: %s\n", line); 
     free(line); 
     line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0); 
     printf("Issuer: %s\n", line); 
     free(line); 
     X509_free(cert); 
    } 
    else 
     printf("No certificates.\n"); 
} 

quand on utilise la commande suivante: openssl req -x509 -nodes -days 365 -newkey rsa: 1024 -keyout mycert.pem -out mycert.pem et exécuter ./sslserver .o 443 puis je cours ./client localhost 443. erreur de serveur: "Aucun certificat.". Je pense que la raison SSL_get_peer_certificate (ssl) renvoie null mais je ne sais pas comment le réparer. Pouvez-vous aider? Code complet:

+0

Près de dupe de (et ressemble au même code que) http://stackoverflow.com/questions/40708532/how-to-load-cerient-certificate-during-ssl-connection-for-mutual-authentication –

Répondre

0

SSL_get_peer_certificates renvoie uniquement un certificat côté serveur si le client a envoyé un certificat. Mais le code auquel vous faites référence ne demande pas de certificat client, ce qui signifie que le client n'en enverra pas. Pour demander un certificat de client le serveur aurait besoin d'utiliser SSL_CTX_set_verify et régler le mode d'au moins SSL_VERIFY_PEER, à savoir au minimum que vous devez faire:

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 

Mais cela ne demandera un certificat client en option. Cela ne provoquera pas de validation de celui-ci. Notez que l'exemple de code que vous utilisez est cassé à cet égard de toute façon car il ne fait aucune sorte de validation de certificat. Cela signifie qu'il est ouvert à un homme trivial dans l'attaque du milieu, c'est-à-dire qu'il n'offre pas la sécurité que vous attendez lors de l'utilisation de SSL. Ainsi, je recommande de ne pas utiliser ce code comme exemple sur la façon d'écrire un client et un serveur SSL sécurisés.

+0

Pour chaque point que vous avez fait, peut-être vous pouvez fournir un code pour lui montrer comment cela est fait. Sinon, c'est effectivement un commentaire. C'est un bon commentaire, cependant. – jww

+0

@jww: J'ai maintenant ajouté un exemple sur la façon de demander un certificat client. Ajout d'exemples pour toutes les autres choses brisées dans le code d'origine, je considère hors de portée de cette question. Au lieu de cela, l'OP devrait abandonner cet exemple de code parce qu'il est cassé depuis le début. –