OpenSSL 4 預設值切換不代表所有 macOS CI 都會失敗;先用同一個專案和 Runner 做版本對照測試,只有確認依賴仍需要 OpenSSL 3 時,才明確固定版本,不要依賴 Runner 的未指定預設值。本文依據截至 2026 年 10 月 23 日已公告的狀態整理驗收方式;公告所列的切換仍是計畫,並非已全面生效。

適合維護 GitHub Actions macOS 工作流程、需要核對原生依賴或 Ruby、Python 整合的開發者。
也適合管理建置節點、需要決定適配新版本、固定 OpenSSL 3 或暫緩切換的 DevOps 工程師。

計畫狀態提醒:Runner Images 公告列出的推出窗口為 2026 年 11 月 2 日至 11 月 8 日,實際安排以公告後續更新為準;公告同時說明 OpenSSL 3 會保留。這是預設命令版本調整,不等於 OpenSSL 3 已移除,也不表示所有專案都會出現不相容問題。查看 Runner Images 官方公告

先確認預設值調整的適用範圍

這次檢查的核心不是「OpenSSL 4 能不能用」,而是工作流程是否把某一個主版本、命令列行為或函式庫載入方式寫死。官方公告指向 macOS 26 與 Xcode 27 Runner 的 openssl 預設命令版本,並未宣告所有 macOS Runner、所有應用程式或所有 OpenSSL 3 使用情境都會同步失效。公告中的適用範圍與推出計畫

截至上述核對日期,公告中的推出窗口尚未開始,因此不應把計畫描述成已全面完成。發布前與切換期間,還要對照目標映像的軟體清單;清單反映的是特定映像內容,應與工作流程實際選用的 Runner 標籤一起閱讀。macOS 26 Runner 軟體清單

OpenSSL 官方將 4.0 列為主版本變更,並指出使用已棄用 API 的程式可能需要調整;這提示的是要檢查相依程式與 API 使用狀況,而不是斷言專案必然不相容。OpenSSL 4.0 遷移指南

先從命令路徑與版本判斷腳本風險

容易被忽略的第一種故障,是腳本把「目前的 openssl 指令」當成固定不變的工具。例如,腳本可能直接呼叫 PATH 中第一個找到的 openssl,只接受特定主版本字串,或解析格式與版本綁定的輸出。預設值變更後,命令仍然存在,但檢查邏輯可能將版本差異誤判為建置失敗。

在 GitHub Actions 的工作流程中加入診斷輸出,並將結果保留在同一個 Job 日誌:

command -v openssl
type -a openssl
openssl version -a

openssl version 用來顯示工具版本,詳細輸出選項可參考 OpenSSL version 命令文件。command -v 與 type -a 則用來確認目前 Shell 如何解析命令,以及是否有多個候選路徑。若版本輸出符合預期,但任務仍失敗,就要再確認腳本是否呼叫其他絕對路徑、使用不同 Shell,或在安裝步驟後改寫了 PATH。

逐項檢查下列情況,避免以「版本不同」代替根因分析:

  • [ ] 腳本是否用字串比對限制 OpenSSL 主版本?
  • [ ] 是否以固定欄位、固定格式解析 openssl version 的輸出?
  • [ ] 指令是否使用 PATH 中的 openssl,還是硬編碼路徑?
  • [ ] 安裝依賴、啟用快取或修改環境變數後,命令解析結果是否改變?
  • [ ] GitHub Actions 日誌是否保留了 Runner 標籤、命令路徑和版本輸出?

若工作流程需要跨 Runner 比較,應讓每個 Job 顯示相同的診斷資訊;GitHub Actions 也有工作流程命令可將資訊寫入日誌或設定輸出,但輸出格式與後續步驟應按其文件處理。GitHub Actions 工作流程命令文件

再把原生依賴拆成編譯、連結與載入

原生依賴出錯時,先從日誌定位故障階段,不要把所有訊息都歸類為「OpenSSL 不相容」。缺少標頭檔或 API 宣告,通常要查編譯環境與依賴版本;符號解析失敗要查連結設定;程式啟動後才找不到動態函式庫,則應核對執行期載入路徑。三者的修復位置不同,單純改 PATH 未必能處理後兩者。

檢查建置輸出時,分別記錄編譯器實際使用的標頭檔、連結器選到的函式庫,以及執行時載入的動態函式庫。Apple 的文件說明了依賴執行路徑與動態函式庫定位的關係,可用來協助判斷「建置成功、執行失敗」這類問題。Apple 動態函式庫執行路徑文件

對 Ruby、Python 或其他包含原生擴充的執行環境,也要確認擴充模組建置時與執行時所使用的函式庫。依賴文件若聲明需要特定 OpenSSL 主版本,應先核對該依賴的官方相容說明,再以專案的實際建置和測試結果作結論;不能只因 Runner 上有 OpenSSL 4,就推定所有依賴都已連結到它。

接著驗收 TLS 與憑證任務的實際行為

憑證與 TLS 工作常被腳本包裝成多個步驟:產生金鑰、建立憑證、檢查欄位,再交給應用程式或測試服務使用。即使單獨執行某一條 OpenSSL 命令成功,也只能證明該命令在當下環境有結果,不能證明完整流程的參數、輸出與應用程式載入的函式庫都符合預期。

驗收時應逐項記錄:實際命令及參數、退出狀態、產生的檔案、下游工具是否能讀取,以及 TLS 測試是否完成。若工作流程使用 x509 子命令,應按任務所需的操作核對其官方文件,不要只用「憑證檢查通過」作為全鏈路相容證據。OpenSSL x509 命令文件

最後比對本機與 Runner 的執行環境

本機成功、Runner 失敗時,不宜立即認定是 OpenSSL 版本造成。兩邊的作業系統映像、CPU 架構、PATH、依賴來源、快取內容與執行期載入路徑都可能不同。即使本機與 CI 回報相同的版本號,實際使用的函式庫也未必相同。

先在同一提交上留存 CI 的命令路徑、版本輸出與依賴建置日誌,再用同樣的檢查方式記錄本機結果。確認 Runner 標籤與映像內容後,才將差異縮小到工具版本或相依項目。GitHub Actions 的 Runner 選擇文件可用來核對 Job 實際指定的執行環境。GitHub Actions Runner 選擇文件

另一個常見干擾因素是快取:若依賴二進位檔或建置產物來自舊環境,當次測試可能沒有真正重建相關元件。比對時應保存是否命中快取、是否執行原生依賴重建,以及失敗發生在建置還是執行階段,避免將工具鏈漂移誤判成版本回歸。

用對照驗收結果選擇切換或固定版本

決策應基於實際專案測試,而非單看 Runner 的預設版本。先在受控工作流程中跑完命令檢查、原生依賴建置、應用程式啟動、憑證與 TLS 任務,再決定是否擴大切換。若依賴尚未支援 OpenSSL 4,或測試結果不穩定,可依官方公告所述方式明確選擇 OpenSSL 3;如果各項任務均通過,則可更新腳本與依賴,避免長期依賴未指定的預設值。

選項 適用條件 必須驗收 主要風險與回退依據
適配 OpenSSL 4 腳本和依賴已確認支援新主版本,代表性流水線結果一致 命令輸出、原生依賴重建、應用程式載入、憑證與 TLS 任務 若 API、連結或執行期載入失敗,暫停擴大切換並修正相依項目
明確固定 OpenSSL 3 依賴官方說明仍要求 OpenSSL 3,或對照測試未通過 固定方式是否生效、PATH 與載入路徑是否一致、完整測試是否通過 若僅固定 CLI、應用程式卻載入其他函式庫,仍不能視為驗收完成
暫緩切換 尚無可比較日誌、關鍵任務未納入測試,或推出狀態仍待確認 建立基線、確認 Runner 映像與公告更新、補齊失敗任務 不以一次成功或舊快取結果作為放行依據
故障證據 優先核對的層次 下一步
版本檢查腳本中止,但命令存在 PATH、版本字串與輸出解析 對照實際路徑,修正硬編碼假設或明確選擇版本
編譯時找不到標頭檔或 API 開發標頭與依賴版本 查明建置工具實際選用的標頭及相容說明
連結時出現未解析符號 連結器輸入與 API 使用 核對連結到的函式庫版本及程式使用的 API
程式啟動後找不到函式庫 執行期載入路徑 檢查實際載入項目與執行路徑設定
憑證命令成功、下游 TLS 測試失敗 命令參數、輸出及應用程式載入庫 重跑完整流程,分別留存 CLI 與應用程式結果
驗收階段 必留證據 放行條件
Runner 與命令 Runner 標籤、映像清單、命令路徑與版本輸出 已確認執行環境及 OpenSSL 命令來源
原生依賴 編譯、連結日誌及依賴相容依據 建置完成,且連結目標符合預期
執行期 動態函式庫載入資訊與應用程式測試結果 程式能在目標 Runner 正常啟動
憑證與 TLS 命令、產物、退出狀態及下游測試日誌 代表性憑證與 TLS 流程均通過
回退準備 版本選擇、失敗條件與回退步驟 失敗時可回到明確指定且已驗收的版本

常見問題

預設版本切換後,所有 macOS CI 都會自動失敗嗎?
不會。公告描述的是特定 Runner 上預設命令版本的調整,OpenSSL 3 亦會保留。只有腳本、依賴或 TLS 流程對版本、選項或輸出有特定假設時,才需要修正或選擇固定版本。應以專案流水線測試決定,而不是把計畫公告當成故障通知。

GitHub Actions macOS Runner 上怎樣查明 openssl 使用哪個版本?
在 Job 日誌輸出 command -v openssl、type -a openssl 與 openssl version -a,再一併保存 Runner 標籤。這能指出命令解析路徑及工具回報版本,但不能單獨證明應用程式載入了同一個函式庫;原生依賴還要另外檢查連結與執行期載入結果。

需要繼續用 OpenSSL 3 時,應該怎樣設定 macOS Runner?
先查看公告與目標映像軟體清單,按官方公告提供的方式明確選擇版本,並在日誌中驗證命令路徑和版本輸出。接著重建原生依賴、檢查執行期載入函式庫並重跑 TLS 任務。不要假設固定命令列工具就會自動固定所有應用程式的連結結果。

OpenSSL 4 切換前,哪些 CI 任務不能漏測?
除了版本與腳本判斷,還要驗收原生依賴的編譯、連結、程式啟動與函式庫載入,並測試實際使用的憑證和 TLS 流程。若 Ruby、Python 或其他執行環境包含原生擴充,也要在 CI 中重新建置並執行相關測試,避免只驗證獨立命令。

如果本機或既有 CI 難以重現相同的 macOS Runner,應先盤點現有方案的限制:本機節點可能與 CI 映像、依賴來源及載入路徑不同;共用建置節點較難隔離版本對照;未固定的雲端預設值則可能隨映像更新而改變。對需要真實 macOS 環境完成對照驗收的團隊,獨立遠端 Mac 節點可作為補充測試環境;若只是偶爾查詢版本、而現有 Runner 已能穩定重現,就沒有必要額外租用。可先了解 RUVCLOUD 遠端 Mac 環境,再按測試週期評估 RUVCLOUD 方案與計費資訊。最後仍應以 Runner Images 公告及目標映像軟體清單核對推出狀態,避免把計畫日期當成已生效日期。