一、故障現象
Jenkins 節點通過 Java Web 方式連接時,報錯:
java.io.IOException: Failed to connect to https://xxxx.zte.com.cn/yyyy/tcpSlaveAgentListener/: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed
二、故障定位及解決方案
1. 證書有效性驗證失敗
原因:Java 客戶端無法驗證 Jenkins 服務器的 SSL 證書,常見于以下情況:
- 證書已過期。
- 系統時間不正確導致證書有效期校驗失敗。
- 自簽名證書未被信任。
- 證書鏈不完整(缺少中間證書)。
解決方案:
(1) 檢查證書有效期
# 使用 openssl 檢查證書有效期
openssl s_client -connect xxxx.zte.com.cn:443 -servername xxxx.zte.com.cn | openssl x509 -noout -dates
- 證書過期:需在服務器端更新證書(如 Let’s Encrypt 證書需續訂)。
- 證書未過期:繼續排查其他原因。
(2) 檢查系統時間
系統時間不正確會導致證書有效期校驗失敗,需同步客戶端和服務器時間。
2. 系統時間同步(重點細化)
(1) 查看當前時間
# 查看系統時間
date# 查看硬件時鐘時間(BIOS 時間)
sudo hwclock --show
(2) 手動設置系統時間(臨時方案)
僅用于緊急修復,長期建議使用 NTP 服務。
# 設置系統時間為 2024-01-01 12:00:00(示例)
sudo date -s "2024-01-01 12:00:00"# 驗證系統時間是否已更新
date
(3) 同步系統時間到硬件時鐘
確保重啟后時間持久化。
# 將系統時間寫入硬件時鐘
sudo hwclock --systohc# 驗證硬件時鐘時間
sudo hwclock --show
(4) 配置 NTP 服務(長期方案)
# Ubuntu/Debian
sudo apt install ntpdate -y
sudo ntpdate pool.ntp.org
sudo systemctl start systemd-timesyncd
sudo systemctl enable systemd-timesyncd# CentOS/RHEL
sudo yum install ntp -y
sudo ntpdate pool.ntp.org
sudo systemctl start chronyd
sudo systemctl enable chronyd
(3) 導入證書到 Java 信任庫
適用于自簽名證書或內部 CA 簽發的證書。
(1) 導出服務器證書
openssl s_client -connect xxxx.zte.com.cn:443 -servername xxxx.zte.com.cn </dev/null | openssl x509 -out jenkins-cert.pem
(2) 查找 Java 信任庫路徑
# 默認路徑(根據實際安裝位置調整)
sudo find / -name "cacerts" 2>/dev/null
(3) 導入證書到信任庫
# 導入證書(默認密碼:changeit)
sudo keytool -import -alias jenkins-cert -keystore /path/to/java/lib/security/cacerts -file jenkins-cert.pem
- 輸入
yes
確認信任證書。
(4) 重啟 Jenkins 節點
# 重啟 Jenkins 服務或節點進程
sudo systemctl restart jenkins
(4) 檢查證書鏈完整性
確保服務器配置了完整的證書鏈(包括中間證書)。
openssl s_client -connect xxxx.zte.com.cn:443 -showcerts
- 證書鏈缺失:在服務器(如 Nginx/Apache)配置中補充中間證書。
三、驗證故障是否解決
- 查看 Jenkins 節點日志:
tail -f /var/log/jenkins/jenkins.log
- 手動觸發節點連接:
- 在 Jenkins Web 界面中,進入 節點管理 → 目標節點 → 啟動代理。
四、注意事項
- 手動設置時間僅為臨時方案,長期需通過 NTP 服務同步時間,避免時間漂移。
- 自簽名證書需定期更新,并在 Java 信任庫中同步更新。
- 生產環境禁用臨時證書驗證方案(如跳過 SSL 校驗),避免安全風險。
五、總結流程圖
1. 證書有效性驗證失敗├─ 檢查證書是否過期 → 是:更新證書 → 結束├─ 檢查系統時間 → 不正確:同步時間(手動或 NTP) → 重新驗證├─ 導入證書到 Java 信任庫 → 重新啟動節點 → 驗證連接└─ 檢查證書鏈完整性 → 補充中間證書 → 重新驗證
通過以上步驟,可系統化定位并解決 Jenkins 節點連接時的 SSL 證書驗證失敗問題。