2
votes

python 3.73 (Windows, urllib3) ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]

Après avoir exécuté du code simple:

from urllib3 import ProxyManager

def GET(url):
    http = ProxyManager("https://91.208.39.70:8080")
    response = http.urlopen('GET', url)
    print(response.data)
    return ''


if __name__ == '__main__':
    result = GET("https://example.com")
    print(result)

J'ai les prochaines erreurs:

Traceback (dernier appel le plus récent): Fichier "F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ connectionpool.py", ligne 597, dans urlopen self._prepare_proxy (conn) File "F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ connectionpool.py ", ligne 807, dans le fichier _prepare_proxy conn.connect ()" F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ connection.py " , ligne 350, dans connect ssl_context = context) Fichier "F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ util \ ssl_.py", ligne 355, dans ssl_wrap_socket renvoyer context.wrap_socket (sock, server_hostname = server_hostname) Fichier "F: \ Run \ Lprogr \ Phyton \ lib \ ssl.py", ligne 412, dans wrap_socket session = session Fichier "F: \ Run \ Lprogr \ Phyton \ lib \ ssl.py", ligne 853, dans _create self.do_handshake () File "F: \ Run \ Lprogr \ Phyton \ lib \ ssl.py", ligne 1117, dans do_handshake self._sslobj.do_handshake () ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED verify_FAILED] certificat signé dans la chaîne de certificats (_ssl.c: 1056)

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent): Fichier "F: /My/Documents/PycharmProjects/proxyTester/proxy.py", ligne 17, in result = GET (" https://example.com ") Fichier "F: / My /Documents/PycharmProjects/proxyTester/proxy.py ", ligne 11, dans GET response = http.urlopen ('GET', url) File" F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ poolmanager. py ", ligne 451, dans urlopen return super (ProxyManager, self) .urlopen (method, url, redirect = redirect, ** kw) File" F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ poolmanager .py ", ligne 326, dans urlopen response = conn.urlopen (method, u.request_uri, ** kw) File" F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ connectionpool.py ", ligne 670, dans urlopen ** response_kw) Fichier "F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ connectionpool.py", ligne 670, dans urlopen ** response_kw) Fichier "F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ connectionpool.py ", ligne 670, dans urlopen ** response_kw) Fichier" F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ connectionpool.py ", ligne 641 , dans urlopen _stack trace = sys.exc_info () [2]) Fichier "F: \ Run \ Lprogr \ Phyton \ lib \ site-packages \ urllib3 \ util \ retry.py", ligne 399, par incrément, déclenche MaxRetryError (_pool, url, error or ResponseError (cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool (host = 'example.com', port = 443): Nombre maximal de tentatives dépassé avec l'url: / (Causé par SSLError (SSLCertVerificationError (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate) échec de la vérification: certificat auto-signé dans la chaîne de certificats (_ssl.c: 1056) ')))

MISE À JOUR: Je ne veux pas ignorer la validation du certificat.


2 commentaires

Double possible de Ignorer la validation du certificat avec urllib3


Oh, donc je pense que le problème est que vous appelez l'ip au lieu du nom du domaine, et vos certificats sont probablement enregistrés pour le nom de ce domaine, pas pour l'ip ...


3 Réponses :


1
votes

Les certificats sont enregistrés pour un nom de domaine, pas pour une adresse IP. Soit vous faites votre demande sur un nom de domaine , soit vous ignorez la vérification ssl (cf. ici ), soit vous remplacez https par http (ne fonctionnera que si le serveur autorise les connexions http)


0 commentaires

1
votes

Enfin trouvé une solution.

A. Ignorer la vérification SSL:

http = ProxyManager("https://91.208.39.70:8080", cert_reqs='CERT_REQUIRED', ca_certs='f:/cert/certs.pem')

B. Ne pas ignorer la vérification SSL:

J'ai téléchargé CA Bundle à partir de certifi , place dans n'importe quel dossier, par exemple: f:\cert . Et codé comme ceci:

http = ProxyManager("https://91.208.39.70:8080", cert_reqs=ssl.CERT_NONE)

Informations supplémentaires .

Si quelqu'un connaît une autre solution de travail, veuillez suggérer ...


0 commentaires

0
votes

Si vous êtes sur le serveur Windows 2018/2019 (je l'ai essayé sur un serveur de centre de données personnel.), Vous pouvez émettre la commande ci-dessous pour permettre à vos programmes de se connecter. Il s'agit d'un correctif à l'échelle du système pour ce que je peux dire. J'ai dû l'exécuter à partir d'un terminal administratif pour le faire fonctionner mais cette commande a résolu tous mes problèmes.

certutil -generateSSTFromWU roots.sst && certutil -addstore -f root roots.sst && del roots.sst

Bonne chance à vous!


0 commentaires