1971 字
10 分鐘

GitHub SHA-1 HTTPS 退場後連不上怎麼查?Git、API 與 CI 修復清單

GitHub 已在 2026 年 9 月 15 日完成 SHA-1 in HTTPS 的退場。影響範圍包含瀏覽器存取 GitHub、使用 API 的程式,以及透過 HTTPS push/pull 的 Git client;GitHub Enterprise Server(GHES)不在這次 github.com 退場範圍內。

直接答案是:先把問題拆成瀏覽器、Git、API client 和 CI container 四層,更新各層的 Git/libcurl/OpenSSL/作業系統與 CA 憑證;不要先設 http.sslVerify=false 或 GIT_SSL_NO_VERIFY=1。所有 TLS 錯誤都不一定是 SHA-1,但這次退場讓舊 runtime、舊 proxy 和舊企業映像檔更容易在握手階段暴露。

先確認你遇到的是哪一層#

同樣一句「GitHub 連不上」,可能是完全不同的故障。先記錄失敗入口與錯誤時間,不要把四種環境的 workaround 混在一起:

入口先測什麼常見責任邊界
瀏覽器https://github.com、https://github.dev瀏覽器版本、OS、企業 TLS inspection、代理憑證
Git HTTPSgit ls-remote 或公開 repo 的 cloneGit、libcurl、TLS backend、CA bundle、proxy
GitHub APIcurl -I https://api.github.com 或 SDK health checkcurl/runtime TLS、CA、HTTP proxy、SDK 版本
CI/Docker在實際 runner/container 中重跑上述命令base image、ca-certificates、OpenSSL、網路出口和 secret proxy

如果瀏覽器正常但 CI 失敗,優先查 CI image 和 egress;如果 Git 與 API 同時失敗,優先查共用 TLS library 或代理;如果只有一個 repository 失敗,先查權限、URL 和 repository 狀態,不要直接歸因 SHA-1。

第一輪:收集版本與 TLS backend#

在問題環境執行以下指令,輸出可以貼進內部 issue,但要先確認沒有公司代理的敏感資訊:

Terminal window
git --version
git config --show-origin --get http.sslBackend || true
curl --version
openssl version -a

Git 可能透過 libcurl 使用 OpenSSL、Secure Transport 或其他 TLS backend;curl —version 的 Features 和 SSL 行會告訴你它實際連到哪套函式庫。不要只在自己的筆電更新 Git,就宣稱 production runner 已修好;CI 裡的 binary、CA bundle 和 proxy route 可能完全不同。

接著用不需要 token 的公開 repository 測 Git HTTPS:

Terminal window
GIT_CURL_VERBOSE=1 git ls-remote https://github.com/git/git.git HEAD

這會顯示連線與 TLS/HTTP 協商的診斷資訊,不會替公開 repository 取得寫入權限。若你的環境會把 verbose output 收進共享 log,仍應檢查 host name、代理資訊和自訂 header 是否包含內部細節;不要把含有 Authorization 的 clone URL 貼出來。

API 入口則先做不帶身份的 header request:

Terminal window
curl -I https://github.com
curl -I https://api.github.com

若 curl 回應 200、301 或 403,但 TLS 已成功建立,問題可能不是 SHA-1,而是 API rate limit、身份驗證、路徑或 proxy policy。這就是為什麼要先把「握手失敗」和「HTTP 層拒絕」分開。

瀏覽器與一般使用者的修復順序#

GitHub 的公告建議使用現代瀏覽器,並可用 https://github.dev 協助確認瀏覽器和 GitHub 的基本相容性。若瀏覽器完全打不開:

  1. 先更新瀏覽器與作業系統,重新測試一般無痕視窗。
  2. 暫時避開企業 TLS inspection 或受控網路,用可信任的行動網路做對照。
  3. 檢查 OS 是否仍使用過期的根憑證與時間設定。
  4. 若只有公司網路失敗,把瀏覽器錯誤、proxy 名稱和時間交給網路管理員,不要自行安裝來路不明的根憑證。

「無痕視窗成功」通常只代表 extension、cookie 或本地 policy 有影響,不代表 TLS 相容性已經修好;仍要回到公司實際登入與工作流程驗證。

Git client:更新工具,不要關掉憑證驗證#

舊 Git、舊 libcurl 或舊 OS 元件可能無法接受 GitHub 現在的 HTTPS 憑證鏈。修復要分成三件事:

  • 更新 Git 到作業系統與團隊支援的現代版本。
  • 更新 base image、libcurl、OpenSSL/Secure Transport 和 ca-certificates。
  • 重新測試 Git credential helper、SSH fallback policy 和 HTTPS proxy。

不要用下面的設定當正式解法:

Terminal window
# 不要在個人或 CI 設定中保留
git config --global http.sslVerify false
export GIT_SSL_NO_VERIFY=1

它們只會把憑證驗證關掉,既不能修好舊 TLS backend,也會讓中間人攻擊更難被發現。若升級後仍失敗,請保留 GIT_CURL_VERBOSE=1 的必要片段,確認是否卡在 proxy CONNECT、certificate chain、TLS protocol,還是 GitHub 回傳的 HTTP status。

CI/Docker 特別容易漏掉的地方#

在 CI 中,最常見的錯誤不是 workflow YAML,而是 image 內的系統元件太舊。每次 runner 或 base image 更新後,至少做一次:

Terminal window
git --version
curl --version
git ls-remote https://github.com/git/git.git HEAD

如果是 Alpine、Debian、Ubuntu 或自製 image,確認 ca-certificates 有安裝並且已更新;如果公司 outbound proxy 會重簽憑證,確認 runner trust store 是由正式流程注入,而不是把 sslVerify 關掉。build cache 可能讓你以為 image 更新了,實際執行的 layer 仍是舊版本,建議在驗收 log 印出完整 image digest。

API SDK 與 runtime:不要只更新 Git#

如果 Git clone 正常、瀏覽器也正常,但應用程式呼叫 GitHub API 失敗,問題常落在應用程式自己的 HTTP stack:

  • Node.js、Python、Java 或 Go runtime 可能連結不同的 TLS/CA 實作。
  • container 內的 CA bundle 可能和 host 不同。
  • SDK 可能透過公司 proxy 或自訂 agent,繞過系統預設設定。
  • 長期運行的 process 可能仍使用舊 container,更新 image 後要真的 rollout。

先在同一個 process environment 中測最小 HTTPS request,再跑完整 SDK workflow。不要為了通過 health check 把證書驗證改成 rejectUnauthorized=false、verify=False 或等效設定;這些是安全退化,不是相容性修復。

GHES 不要套用錯誤的結論#

GitHub 這次公告針對的是 github.com、GitHub Enterprise Cloud、Data Residency 和 partner CDN 的 HTTPS 服務;GitHub Enterprise Server(GHES)不受這次退場直接影響。如果只有自架 GHES 失敗,應查你們自己的 server certificate、反向代理、TLS policy、client trust store 和升級狀態,不能只照抄 github.com 的 workaround。

同理,GitHub CLI 的套件金鑰到期是另一條套件簽章鏈;可以參考GitHub CLI Linux 金鑰輪替的 APT/RPM 排查,但不要把 package signing key、HTTPS certificate chain 和 Git credential 混成同一個「GitHub 金鑰」問題。

建議的驗收矩陣#

修復後,請在真正會執行工作的環境驗證,而不是只在開發者筆電上開首頁:

測試通過條件
BrowserGitHub、登入、github.dev 可正常載入,無 certificate warning
Git read公開 repo git ls-remote 成功
Git write使用測試 branch 完成一次 push/fetch,確認 credential helper 正常
API公開 endpoint 和應用程式使用的 authenticated endpoint 都能建立 TLS 並得到預期 HTTP 回應
CI乾淨 runner/container 以實際 image digest 通過 checkout、API step 和 artifact upload
代理網路公司 proxy、TLS inspection、egress firewall 的正式路徑都通過

若只有某一層仍失敗,把錯誤縮小到那一層再處理;不要為了讓一個舊 job 通過,把整個組織的 TLS 驗證關掉。

結論:先更新相容性,再保留驗證能力#

SHA-1 HTTPS 退場的正確處理方式,是把舊瀏覽器、Git/libcurl、API runtime、CA bundle、proxy 和 CI image 一層層更新,並用公開 repo 與 API 做最小可重現測試。先確認失敗發生在 TLS handshake 還是 HTTP/權限層,再決定修哪個元件;憑證驗證必須保留,GHES 也要依自己的部署邊界判斷,不要把 github.com 公告當成所有 GitHub 連線的通用錯誤碼。

常見問題#

Q: git pull 失敗就一定是 SHA-1 退場嗎?#

A: 不一定。也可能是 DNS、proxy CONNECT、CA bundle、過期 token、repository 權限或 URL 錯誤。先用 GIT_CURL_VERBOSE=1 git ls-remote https://github.com/git/git.git HEAD 確認公開 repo 的 TLS/HTTP 路徑,再比對你的私有 repo 工作流程。

Q: 可以先把 http.sslVerify 設成 false 救 CI 嗎?#

A: 不應該。這會關閉憑證驗證,無法證明舊 TLS stack 已相容,也會留下中間人攻擊風險。應更新 Git、libcurl、OpenSSL、CA bundle 或企業 proxy 的正式 trust chain。

Q: GHES 也必須立刻做同一個升級嗎?#

A: GitHub 的這次 github.com HTTPS 退場公告明確把 GHES 排除在外。自架環境仍可能有自己的 TLS policy 或憑證到期問題,但應依 GHES、反向代理和 client 的版本支援矩陣處理。

參考資料:

GitHub Changelog:SHA-1 in HTTPS on GitHub sunset

GitHub announcement:Sunsetting SHA-1 in HTTPS on GitHub

GitHub SHA-1 HTTPS 退場後連不上怎麼查?Git、API 與 CI 修復清單
https://laplusda.com/posts/github-sha1-https-sunset-troubleshooting/
作者
Zero
發佈於
2026-09-16
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。