web-dev-qa-db-fra.com

Comment désactiver la vérification ssl dans python 3.x?

J'utilise urllib.request.urlretrieve pour télécharger un fichier en local.

urllib.request.urlretrieve(url_string,file_name)

Cela génère une erreur:

ssl.CertificateError n'a pas été gérée par le code utilisateur Message: le nom d'hôte 'foo.net' ne correspond ni à 'a248.e.akamai.net', '. akamaihd.net', '. akamaihd- staging.net ',' . akamaized.net ','. akamaized-staging.net '

Si vous copiez l'URL dans Chrome, il vous montrera une notification et vous devrez dire quelque chose comme "continuer à accéder à l'URL".

15
Bing Gan

Utilisation urllib.request.urlopen avec contexte ssl personnalisé :

import ssl
import urllib.request

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

with urllib.request.urlopen(url_string, context=ctx) as u, \
        open(file_name, 'wb') as f:
    f.write(u.read())

Alternativement, si vous utilisez requests bibliothèque , cela pourrait être plus simple:

import requests

with open(file_name, 'wb') as f:
    resp = requests.get(url_string, verify=False)
    f.write(resp.content)
25
falsetru

La fonction urllib.request.urlretrieve N'accepte aucune option SSL mais urllib.request.urlopen L'accepte.

Cependant, à la place, en créant un contexte SSL sécurisé avec ssl.create_default_context() et en le rendant non sécurisé, vous pouvez créer un contexte non sécurisé avec ssl.SSLContext():

Ce:

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

est équivalent à:

ctx = ssl.SSLContext()

(Pour Python <3.5.3 utilisez ssl.SSLContext(ssl.PROTOCOL_TLSv1))

Ce qui fait un Nice one-liner:

import ssl
import urllib.request

with urllib.request.urlopen("https://wrong.Host.badssl.com/", context=ssl.SSLContext()) as url:
    print(url.read())
2
mx0