web-dev-qa-db-fra.com

Erreur SSL avec Python malgré les dépendances à jour

Je reçois une erreur SSL "mauvaise poignée de main". La plupart des réponses similaires à ce problème semblent provenir d'anciennes bibliothèques, certifiées 1024 bits. incompatibilité, etc ... Je pense que je suis à jour, et je ne peux pas comprendre pourquoi je reçois cette erreur.

INSTALLER:

  • demandes 2.13.0
  • certifi 2017.01.23
  • "OpenSSL 1.0.2g 1 mars 2016"

Je frappe cette API (clé de certificat 2048 bits): https://api.sidecar.io/rest/v1/provision/application/device/count/

Et obtenir cette erreur: requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

Voir l.44 de https://github.com/sidecar-io/sidecar-python-sdk/blob/master/sidecar.py

Si je tourne verify=False dans les demandes, je peux contourner, mais je préfère comprendre pourquoi la certification échoue.

Toute aide est grandement appréciée; Merci!

11
N. Masson

La validation échoue car le serveur auquel vous accédez est mal configuré, c'est-à-dire que ce n'est pas une faute de votre configuration ou de votre code. En regardant le rapport de SSLLabs vous voyez

La chaîne de certificats de ce serveur est incomplète. Grade plafonné à B.

Cela signifie que le serveur envoie une chaîne de certificats à laquelle il manque un certificat intermédiaire à la racine de confiance et que votre client ne peut donc pas créer la chaîne de confiance. La plupart des navigateurs de bureau contournent ce problème en essayant d'obtenir le certificat manquant ailleurs, mais les bibliothèques TLS normales échoueront dans ce cas. Vous devez explicitement ajouter le certificat de chaîne manquant comme approuvé pour contourner ce problème:

import requests
requests.get('https://api.sidecar.io', verify = 'mycerts.pem')

mycerts.pem doit contenir le certificat intermédiaire manquant et le certificat racine de confiance. Une version testée pour mycerts.pem se trouve dans http://Pastebin.com/aZSKfyb7 .

13
Steffen Ullrich

Cela peut vous aider à résoudre votre problème.

print(requests.get(url, proxies,verify = False))
6
Shadkhan