![](/img/trans.png)
[英]How to Solve [SSL: CERTIFICATE_VERIFY_FAILED] Error when Using urllib without bypassing SSL verification
[英]Bypassing SSL certificate verification using Flask, gunicorn, gevent
我收到 CERTIFICATE_VERIFY_FAILED 錯誤,因為當我使用 urllib 發出 openurl 請求時,它正在檢查 https 證書,並且由於我的端點使用的是自簽名證書(使用我們公司的內部 CA),它們顯然沒有通過驗證檢查。
我知道我可以使用請求,或者創建我自己的上下文,但是它是一個第三方庫正在發出調用,我無法改變這種情況的發生方式。 由於它只是一個內部應用程序,我不太關心驗證,所以我很高興跳過所有 https 請求的驗證。
互聯網建議最簡單的方法是創建一個環境變量PYTHONHTTPSVERIFY=0
,或者用猴子修補 ssl 庫
# Set prior to pretty much everything
import ssl
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
所以這工作正常,直到我 go 使用配置為使用 gevent 工作者的 gunicorn 運行東西。 我也被困在使用 python 2.7.18
想知道是否有人有任何解決方案或想法?
因此,在我解決了很多頭痛之后,問題就出現了,因為當 gunicorn 啟動 gevent 工作人員時,他們會在我的應用程序初始化后調用gevent.monkey.patch_all()
。 不幸的是,這覆蓋了我的猴子補丁(在我的應用程序初始化中完成)並重置了一些東西。
我認為這仍然可以,因為PYTHONHTTPSVERIFY=0
仍然設置,並且 SSL 庫應該看到,並忽略驗證。 然而。 gevent 替換(猴子補丁)系統的 SSL 庫是舊版本,它不查找 ENV 變量。
所以,我需要一種方法來進一步修補猴子補丁( ssl._create_default_https_context = ssl._create_unverified_context
)在 gevent 猴子修補之后!
幸運的是 gunicorn 提供了一個鈎子來做這件事,我們可以在配置文件中設置一個 function 來為我們做這件事。 我的 gunicorn 配置看起來像這樣:
bind = '0.0.0.0:8080'
accesslog = 'gunicornaccess.log'
errorlog = 'gunicornerror.log'
loglevel = 'DEBUG'
timeout = 240000
pidfile = 'gunicorn.pid'
debug = True
worker_class = 'gevent'
workers = 8
threads = 4
def post_worker_init(worker):
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
我的意思是猴子修補一般來說是個壞主意,但這是我讓它工作的唯一方法。 希望這可以避免其他人為我到達這里所經歷的頭痛。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.