我正在嘗試從docker容器中發出https請求。以下是在我的Windows 10主機上運行良好的python代碼:
import certifi
import ssl
import urllib.request
tmp_filename = "penguin.jpg">"https://i.pinimg.com/originals/cc/3a/1a/cc3a1ae4beafdd5ac2293824f1fb0437.jpg"。
print(certifi.where() )
default = ssl.create_default_context()
https_handler = urllib.request.HTTPSHandler(context=ssl.create_default_context() )
opener = urllib.request.build_opener(https_handler)
# add user agent headers to avoid 403 response[/span]。
opener.addheaders = [
(
"User-agent"。
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"/span>。
)]
urllib.request.install_opener(opener)
r = urllib.request.urlretrieve(pingu_link, tmp_filename)
如果我理解正確的話,certifi帶有它自己的一套CA證書,這些證書包含在.pem檔案中,你可以通過呼叫certifi.where()找到。然而,如果我把這個檔案轉換為.crt,并告訴request通過呼叫
https_handler = urllib.request.HTTPSHandler(context=ssl.create_default_context(caile="cacert.crt")
驗證失敗:ssl.SSLCertVerificationError。[SSL: CERTIFICATE_VERIFY_FAILED] 證書驗證失敗:無法獲得本地發行者證書(_ssl.c:1129)。正如這篇文章所解釋的,certifi也自動從windows cert store匯入certfiles。 現在我有點困惑,如果你想在docker容器中驗證SSL證書,這意味著什么?似乎有兩種選擇:
- 只要安裝
ca-certificates包。它應該為大多數CA提供必要的公鑰。 - 安裝你自己的(可能是自簽的)證書:將其復制到你的 docker 容器中,并通過呼叫
update-ca-certificates告訴 ca-certificates 包它。(您也可以將其安裝在windows全域證書存盤中,根據github上的這個問題,它應該可以與docker一起開箱作業)
不幸的是,第一個方法似乎對我不起作用。它引發了與上述相同的驗證錯誤。更糟糕的是,由于我不知道哪個.crt檔案是在沒有docker的情況下用來驗證證書的,所以第二個選項也不可能。下面是Docker檔案:
# start with a python env that already has urllib3 installed.
FROM company_harbor/base_py3_container
ENV HTTP_PROXY="my_company_proxy"/span>
ENV HTTPS_PROXY="my_company_proxy"/span>
# install ca certificates
運行 apt-get update &&。
apt-get install ca-certificates -y &&
apt-get clean
RUN pip install --upgrade certifi --trusted-host=pypi.org --trusted-host=files.pythonhosted.org
# 如果我找到了正確的.crt檔案,我會怎么做?
# COPY cacert.crt /usr/share/ca-certificates/cacert.crt。
# RUN chmod 644 /usr/share/ca-certificates/cacert.crt
運行update-ca-certificates
COPY ./download_penguin.py ./download_penguin.py
CMD [ "python"/span>, "download_penguin.py"/span> ]
為了在docker中用python驗證SSL證書,你需要做什么?
uj5u.com熱心網友回復:
事實證明,公司代理可以以中間人方式交換SSL證書。
來自apt-get install ca-certificates或python的certifi軟體包的標準證書不會包括這些公司證書。此外,這不是一個專門與Docker有關的問題,而是一個 "如何在Linux上安裝根證書 "的問題。更準確地說,是Debian,因為Docker容器默認運行的是Debian。
這并不像預期的那樣簡單。以下是最終的作業情況:
首先使用公司的.pem格式的證書
。對它們進行重新命名,使它們以.crt結尾。不要使用任何 openssl .pem 到 .crt 的轉換。在我的例子中,我在網上找到的每一個.crt檔案的編碼方式使它無法被Notepad 、Vim等閱讀。另一方面,.pem檔案看起來很好。
將重命名的證書復制到你的作業系統上適當的ca-證書位置。
通過
update-ca-certificates安裝證書。
翻譯成Docker檔案,這里是重要的部分:
COPY root.pem /usr/local/share/ca-certificates/root.crt
COPY proxy.pem /usr/local/share/ca-certificates/proxy.crt
運行update-ca-certificates
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329849.html
標籤:
