web-dev-qa-db-ja.com

python 3.xでsslチェックを無効にするにはどうすればよいですか?

ローカルにファイルをダウンロードするためにurllib.request.urlretrieveを使用しています。

urllib.request.urlretrieve(url_string,file_name)

エラーが発生します:

ssl.CertificateErrorはユーザーコードによって処理されませんでしたメッセージ:ホスト名 'foo.net'は 'a248.e.akamai.net'、 '。akamaihd.net'、 '。akamaihd-のいずれとも一致しませんstaging.net '、' 。akamaized.net '、'。akamaized-staging.net '

URLをChromeにコピーすると、通知が表示され、「URLに移動し続ける」などのように言う必要があります。

15
Bing Gan

使用する - urllib.request.urlopen with custom ssl context

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())

または、 requests library を使用すると、より簡単になる可能性があります。

import requests

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

関数_urllib.request.urlretrieve_はSSLオプションを受け入れませんが、_urllib.request.urlopen_は受け入れます。

ただし、代わりにssl.create_default_context()を使用して安全なSSLコンテキストを作成し、それを安全でないようにする場合は、ssl.SSLContext()を使用して安全でないコンテキストを作成できます。

この:

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

以下と同等です。

_ctx = ssl.SSLContext()
_

(For Python <3.5.3 use ssl.SSLContext(ssl.PROTOCOL_TLSv1)

これにより、ニースワンライナーが作成されます。

_import ssl
import urllib.request

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