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 HTTPS | git ls-remote 或公開 repo 的 clone | Git、libcurl、TLS backend、CA bundle、proxy |
| GitHub API | curl -I https://api.github.com 或 SDK health check | curl/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,但要先確認沒有公司代理的敏感資訊:
git --versiongit config --show-origin --get http.sslBackend || truecurl --versionopenssl version -aGit 可能透過 libcurl 使用 OpenSSL、Secure Transport 或其他 TLS backend;curl —version 的 Features 和 SSL 行會告訴你它實際連到哪套函式庫。不要只在自己的筆電更新 Git,就宣稱 production runner 已修好;CI 裡的 binary、CA bundle 和 proxy route 可能完全不同。
接著用不需要 token 的公開 repository 測 Git HTTPS:
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:
curl -I https://github.comcurl -I https://api.github.com若 curl 回應 200、301 或 403,但 TLS 已成功建立,問題可能不是 SHA-1,而是 API rate limit、身份驗證、路徑或 proxy policy。這就是為什麼要先把「握手失敗」和「HTTP 層拒絕」分開。
瀏覽器與一般使用者的修復順序
GitHub 的公告建議使用現代瀏覽器,並可用 https://github.dev 協助確認瀏覽器和 GitHub 的基本相容性。若瀏覽器完全打不開:
- 先更新瀏覽器與作業系統,重新測試一般無痕視窗。
- 暫時避開企業 TLS inspection 或受控網路,用可信任的行動網路做對照。
- 檢查 OS 是否仍使用過期的根憑證與時間設定。
- 若只有公司網路失敗,把瀏覽器錯誤、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。
不要用下面的設定當正式解法:
# 不要在個人或 CI 設定中保留git config --global http.sslVerify falseexport 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 更新後,至少做一次:
git --versioncurl --versiongit 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 金鑰」問題。
建議的驗收矩陣
修復後,請在真正會執行工作的環境驗證,而不是只在開發者筆電上開首頁:
| 測試 | 通過條件 |
|---|---|
| Browser | GitHub、登入、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 的版本支援矩陣處理。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。