將 Docker 與 Zscaler 搭配使用
在許多企業環境中,網路流量會透過 HTTPS 代理伺服器(例如 Zscaler)進行攔截和監控。雖然 Zscaler 能確保安全合規與網路控管,但對於使用 Docker 的開發人員來說,這可能會造成問題,特別是在建置過程中,可能會發生 SSL 憑證驗證錯誤。本指南概述了如何設定 Docker 容器與建置流程,以正確處理 Zscaler 的自訂憑證,確保在受監控的環境中運作順暢。
憑證在 Docker 中的角色
當 Docker 建置或執行容器時,通常需要從網際網路擷取資源——無論是從映像檔倉庫拉取基礎映像檔、下載相依性套件,或是與外部服務通訊。在代理伺服器環境中,Zscaler 會攔截 HTTPS 流量,並將遠端伺服器的憑證替換為其自身的憑證。然而,Docker 預設並不信任此 Zscaler 憑證,因而導致 SSL 錯誤。
x509: certificate signed by unknown authority這些錯誤發生是因為 Docker 無法驗證 Zscaler 所提供的憑證有效性。為了避免這種情況,您必須將 Docker 設定為信任 Zscaler 的憑證。
為 Docker Desktop 設定 Zscaler 代理伺服器
根據 Zscaler 的部署方式,您可能需要手動設定 Docker Desktop 代理伺服器設定,以使用 Zscaler 代理伺服器。
如果您透過 Zscaler Client Connector 將 Zscaler 作為系統層級的代理伺服器使用,裝置上的所有流量都會自動透過 Zscaler 路由,因此 Docker Desktop 會自動使用 Zscaler 代理伺服器,無需額外設定。
如果您未將 Zscaler 作為系統層級的代理伺服器使用,請在 Docker Desktop 中手動設定代理伺服器設定。您可以使用設定管理 (Settings Management) 為組織中的所有用戶端設定代理伺服器,或者在 Docker Desktop GUI 中的 設定 > 資源 > 代理伺服器 (Settings > Resources > Proxies) 編輯代理伺服器設定。
在 Docker 映像檔中安裝根憑證
為了讓容器能夠使用並信任 Zscaler 代理伺服器,請將憑證嵌入映像檔中,並設定映像檔的信任儲存庫。在映像檔建置時安裝憑證是較佳的做法,因為這樣就不需要在啟動時進行額外設定,並能提供一個可審核且一致的環境。
取得根憑證
取得根憑證最簡單的方法是從管理員已經安裝過該憑證的機器上匯出它。您可以使用網頁瀏覽器或系統的憑證管理服務(例如 Windows 憑證儲存區)。
範例:使用 Google Chrome 匯出憑證
- 在 Google Chrome 中,前往
chrome://certificate-manager/。 - 在本機憑證 (Local certificates) 下,選擇檢視已匯入的憑證 (View imported certificates)。
- 找到 Zscaler 根憑證,通常標記為 Zscaler Root CA。
- 開啟憑證詳細資訊並選擇匯出 (Export)。
- 以 ASCII PEM 格式儲存憑證。
- 在文字編輯器中開啟匯出的檔案,確認其中包含
-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----。
取得憑證後,將其儲存在可存取的儲存庫中,例如 JFrog Artifactory 或 Git 儲存庫。或者,也可以使用 AWS S3 等通用儲存服務。
使用憑證進行建置
若要在建置映像檔時安裝這些憑證,請將憑證複製到建置容器中並更新信任儲存庫。Dockerfile 的範例如下:
FROM debian:bookworm
COPY zscaler-root-ca.crt /usr/local/share/ca-certificates/zscaler-root-ca.crt
RUN apt-get update && \
apt-get install -y ca-certificates && \
update-ca-certificates在此,zscaler-root-ca.crt 為根憑證,位於建置內容的根目錄中(通常在應用程式的 Git 儲存庫內)。
如果您使用構件儲存庫 (artifact repository),則可以直接使用 ADD 指令擷取憑證。您也可以使用 --checksum 旗標來驗證憑證的內容摘要 (digest) 是否正確。
FROM debian:bookworm
ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d \
https://artifacts.example/certs/zscaler-root-ca.crt /usr/local/share/ca-certificates/zscaler-root-ca.crt
RUN apt-get update && \
apt-get install -y ca-certificates && \
update-ca-certificates使用多階段建置
對於需要在最終執行時期映像檔中使用憑證的多階段建置,請確保憑證安裝程序發生在最終階段。
FROM debian:bookworm AS build
WORKDIR /build
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
curl \
git
RUN --mount=target=. cmake -B output/
FROM debian:bookworm-slim AS final
ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d \
https://artifacts.example/certs/zscaler-root-ca.crt /usr/local/share/ca-certificates/zscaler-root-ca.crt
RUN apt-get update && \
apt-get install -y ca-certificates && \
update-ca-certificates
WORKDIR /app
COPY --from=build /build/output/bin .
ENTRYPOINT ["/app/bin"]結論
將 Zscaler 根憑證直接嵌入您的 Docker 映像檔中,可確保容器在 Zscaler 代理環境中運作順暢。透過這種方式,您可以減少潛在的執行時期錯誤,並建立一個一致、可審核的設定,進而在受監控的網路中順暢地操作 Docker。