題幹與適用場景
這道後端題考察憑證生命週期和服務間通訊的工程邊界。重點不是把新憑證複製到每台機器,而是讓身分簽發、信任更新、連線重建和回復在時間上有重疊。
面試官考察什麼
- 是否區分葉憑證輪換、信任包輪換和根 CA 遷移。
- 是否能處理長連線、快取、時鐘偏差、並發更新和部分節點失敗。
- 是否會使用短生命週期工作負載身分,而不是把私鑰寫入映像檔或環境變數。
- 是否能定義灰度、驗收、回復和憑證到期告警。
回答前需要釐清的問題
先確認服務發現方式、連線是短連線還是長連線、憑證由誰簽發、是否跨叢集或信任域、用戶端如何載入金鑰、最長請求和連線時長,以及是否允許雙根或雙憑證並存。還要確認輪換目標是葉憑證、簽發中間 CA,還是整個信任域。
30 秒回答框架
我會把輪換拆成信任包先行、憑證後換、連線漸進重建三步。先讓所有驗證方接受舊根和新根,再簽發由新鏈路驗證的短期葉憑證;用戶端和代理透過動態介面原子載入新金鑰,保留舊材料直到所有連線排空。灰度期間監控握手失敗、憑證剩餘壽命、信任包版本和連線重試;發現異常就停止簽發並恢復舊路徑,絕不關閉憑證驗證作為回復。
分步深入解答
1. 建立身分和信任模型
為每個工作負載分配穩定的 SPIFFE ID 或等價身分,區分生產、預發布和不同信任域。驗證方持有 trust bundle,簽發方只在授權的工作負載證明通過後簽發。私鑰在工作負載側生成並保持受限存取,控制面不應把長期私鑰散發到應用程式設定。
2. 先發布相容的信任包
根或中間 CA 遷移時先發布包含舊根和新根的雙軌 trust bundle,並確認所有驗證方已載入新版本。舊根不能立即刪除,因為仍有舊憑證和長連線。記錄 bundle 版本、載入成功率和未更新執行個體,達到門檻後才進入新憑證階段。
3. 簽發和載入新憑證
工作負載透過 Workload API、sidecar 或等價動態介面取得短期 X.509 身分。憑證更新採用提前窗口,私鑰和憑證成對原子替換;讀取方要麼看到舊對,要麼看到新對,不能混用。失敗時保留上一份仍有效的材料並重試,不能把過期憑證無限延長。
4. 處理連線與請求邊界
新憑證通常只影響新建 TLS 工作階段,長連線仍可能使用舊憑證。對 HTTP/2、gRPC 或資料庫連線設定最大連線年齡和優雅 drain,在新連線驗證成功後逐步關閉舊連線。請求重試必須遵守冪等性、逾時和退避,避免輪換把流量放大成重試風暴。
5. 設計灰度、回復和根輪換
先在一個工作負載池和一條流量路徑驗證,再按區域或服務擴展。回復優先停止新憑證簽發、恢復舊 bundle 和舊連線策略;只有在確認所有舊憑證都已失效後才移除舊根。若新根私鑰洩露,緊急撤銷和隔離路徑必須獨立於正常輪換流程。
6. 觀測與故障演練
監控憑證剩餘壽命分位數、簽發失敗、SVID 或 bundle 更新延遲、TLS 握手錯誤、按身分和版本分組的 4xx/5xx,以及連線 drain 時長。定期用測試身分驗證到期告警、時鐘偏差、控制面不可用和單個區域無法更新的行為。日誌記錄身分 ID、版本和結果,不記錄私鑰。
高品質示範回答
我會先確認是葉憑證、CA 還是信任域輪換,並為工作負載使用穩定身分和短生命週期 X.509 SVID。CA 遷移先發布包含舊根與新根的雙軌 trust bundle,確認所有驗證方載入後,再透過 Workload API 或代理動態簽發新葉憑證。金鑰與憑證原子替換,保留仍有效的舊材料;新建連線先使用新憑證,HTTP/2、gRPC 等長連線按最大年齡優雅 drain。灰度按工作負載池和區域推進,監控握手錯誤、bundle 版本、剩餘壽命和重試率。異常時停止新簽發、恢復舊 bundle 和連線策略,不以關閉驗證作為回復;舊根在確認舊憑證和連線都排空後才刪除。整個過程用測試身分演練到期、時鐘偏差和控制面故障,並確保私鑰不進入映像檔、環境變數或日誌。
常見錯誤
- 先刪除舊根,再發布新根,導致仍使用舊憑證的節點全部失敗。
- 只替換檔案,不處理長連線、連線池和正在執行的請求。
- 把私鑰打進映像檔、環境變數或普通設定中心。
- 新舊金鑰沒有原子切換,出現憑證與私鑰不匹配。
- 輪換失敗時關閉 TLS 驗證或永久延長過期憑證。
- 只有到期前幾分鐘的告警,沒有 bundle 版本、握手錯誤和更新延遲觀測。
追問及應對
為什麼 trust bundle 要先接受新舊兩條鏈?
這樣驗證方可以先認識新根,舊憑證仍能工作,新憑證隨後上線,避免簽發和驗證之間出現空窗。舊根應在憑證和連線排空後再移除。
憑證更新後長連線怎麼辦?
限制連線最大年齡,優雅 drain 舊連線並在新連線成功握手後關閉它們。對可重試請求遵守冪等性和退避,不能一次重連所有用戶端。
控制面暫時不可用會不會讓服務立刻中斷?
不會把控制面可用性直接等同於每次請求都要簽發。快取目前仍有效的身分和 trust bundle,提前續期,並設定剩餘壽命告警;快取不能超過明確的安全和合規上限。
如何證明沒有服務仍依賴舊根?
按身分、憑證鏈和 bundle 版本記錄握手與載入事件,先在觀測窗口內確認舊鏈使用量為零,再執行移除。對無法上報的節點應隔離或回復,而不是假設它們已經更新。