Подтвердить что ты не робот

Python 3 urllib игнорировать проверку сертификата SSL

У меня есть настройка сервера для тестирования с самозаверяющим сертификатом и вы хотите проверить его.

Как игнорировать проверку SSL в версии Python 3 urlopen?

Вся информация, которую я нашел относительно этого, касается urllib2 или Python 2. В общем случае.

urllib в python 3 изменилось с urllib2:

Python 2, urllib2: urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

https://docs.python.org/2/library/urllib2.html#urllib2.urlopen

Python 3: urllib.request.urlopen(url[, data][, timeout]) https://docs.python.org/3.0/library/urllib.request.html?highlight=urllib#urllib.request.urlopen

Итак, я знаю, что это можно сделать в Python 2 следующим образом. Однако в Python 3 urlopen отсутствует контекстный параметр.

import urllib2
import ssl

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

urllib2.urlopen("https://your-test-server.local", context=ctx)

И да, я знаю, что это плохая идея. Это предназначено только для тестирования на частном сервере.

Я не мог найти, как это должно быть сделано в документации Python 3 или в любом другом вопросе. Даже те, которые явно упоминают Python 3, все еще имели решение для urllib2/Python 2.

4b9b3361

Ответ 1

Python 3.0 до 3.3 не имеет параметра контекста, он был добавлен в Python 3.4. Таким образом, вы можете обновить версию Python до 3.5, чтобы использовать контекст.

Ответ 2

Принятый ответ только что дал совет использовать python 3. 5+ вместо прямого ответа. Это вызывает замешательство.

Для тех, кто ищет прямой ответ, вот он:

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 f:
    f.read(300)

В качестве альтернативы, если вы используете библиотеку requests, у нее гораздо лучший API:

import requests

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

Ответ скопирован из этого поста (спасибо @falsetru): Как отключить проверку ssl в python 3.x?

Эти два вопроса должны быть объединены.