簡體   English   中英

使用 Flask、gunicorn、gevent 繞過 SSL 證書驗證

[英]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.

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