簡體   English   中英

如何在 python 3.x 中禁用 ssl 檢查?

[英]How do I disable the ssl check in python 3.x?

我正在使用 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'

如果您將網址復制到 Chrome 中,它會向您顯示一條通知,您需要說“繼續訪問該網址”之類的內容。

urllib.request.urlopen自定義 ssl 上下文一起使用

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,它可能會更簡單:

import requests

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

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

(對於 Python < 3.5.3 使用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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM