OpenSSL Ignore Erreur de certificate auto-signé

J’écris un petit programme avec la bibliothèque OpenSSL qui est censé établir une connexion avec un serveur SSLv3. Ce serveur dissortingbue un certificate auto-signé, ce qui entraîne l’échec de la négociation avec le message suivant: “Échec de la négociation de l’alerte sslv3, certificate auto-signé dans la chaîne de certificates.”

Existe-t-il un moyen de forcer la connexion pour continuer? J’ai essayé d’appeler SSL_CTX_set_verify comme suit:

SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); 

Mais cela ne semble rien changer.

Aucune suggestion?

Par défaut, OpenSSL parcourt la chaîne de certificates et essaie de vérifier à chaque étape que SSL_set_verify() ne change pas cela, voir la page de manuel. En le citant:

La procédure de vérification proprement dite est exécutée à l’aide de la procédure de vérification intégrée ou d’une autre fonction de vérification fournie par l’application, définie avec SSL_CTX_set_cert_verify_callback (3).

La solution consiste donc à créer un simple rappel et à le définir, afin de remplacer toute la marche de la chaîne de certificates:

 static int always_true_callback(X509_STORE_CTX *ctx, void *arg) { return 1; } SSL_CTX_set_cert_verify_callback(CTX, always_true_callback); 

Avez-vous essayé de donner à votre application le certificate d’autorité de certificateion du serveur afin que celle-ci puisse vérifier la chaîne de certificates?

Vérifiez ces exemples OpenSSL: http://www.rtfm.com/openssl-examples/

Le fichier wclient.c se connecte à n’importe quelle page https, par exemple:

 wclient -h www.yahoo.com -p 443 

Si vous exécutez cette opération avec l’installation par défaut, vous obtiendrez une erreur de certificate (vous pouvez utiliser l’indicateur -i pour ignorer la vérification du certificate).

Pour vérifier le certificate, vous devez télécharger les certificates de l’autorité de certificateion (Verisign, Thawte, Equifax, etc.), afin de google ce fichier cacert.pem , téléchargez-le et renommez-le en root.pem pour pouvoir vous connecter à un serveur Web et valider son certificate.

Avez-vous essayé de définir SSL_set_verify?

 SSL_set_verify(s, SSL_VERIFY_NONE, NULL); 

Vous pouvez essayer de transmettre votre propre rappel à SSL_set_verify() , puis de procéder à votre propre vérification. C’est moins qu’idéal car je pense que vous devez ensuite effectuer toute la vérification et ensuite permettre à l’erreur auto-signée d’être ignorée, mais vous devriez être capable de déterminer ce que le code de vérification standard fait de la source OpenSSL et de le simplement extraire dans votre propre rappel de vérification et autoriser le code d’erreur spécifique …

Mon exemple de code client ( lien ) fonctionne bien avec un certificate de serveur auto-signé. J’ai le code ci-dessous après SSL_connect et j’ai le contrôle total sur l’acceptabilité des certificates auto-signés dans mon client

 SSL_CTX* ctx = SSL_CTX_new(SSLv3_method()); // TCP connection and SSL handshake ... /* Check the certificatee */ rc = SSL_get_verify_result(ssl); if(rc != X509_V_OK) { if (rc == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT || rc == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) { fprintf(stderr, "self signed certificatee\n"); } else { fprintf(stderr, "Certificate verification error: %ld\n", SSL_get_verify_result(ssl)); SSL_CTX_free(ctx); return 0; } }