[WordPress] 解決 cURL 錯誤 SSL certificate problem: certificate has expired 的方法

本篇文章更新時間:2022/07/21
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


這個問題碰到的完整錯誤其實是「cURL error 60: SSL certificate problem: certificate has expired」

如果是近期才新建立的 WordPress 網站或主機,應該是不會碰到這問題。主要都是網站經營了好幾年,歷經一些更新,但卻沒有完整重建過的環境。

對 WordPress 來說這個錯誤要追得很細不容易。主要先從 WordPress Core 來看,到底是 WordPress 自己的 CA(授權單位憑證)過期還是主機上的授權單位憑證過期?

延伸閱讀:PHP and cURL: How WordPress makes HTTP requests 這篇文章裡有提到 WordPress 怎麼發出請求的一個演進。

如果主機上有安裝 PHP cURL 模組的話,WordPress 預設會用 cURL 功能(class-wp-http-curl.php),否則是用 fsockopen 這個方法來處理(class-requests.php)。

但不管是用哪一個方法處理 HTTPS 請求,WordPress 也都會用上自帶的 wp-includes/certificates/ca-bundle.crt 授權單位憑證來發出請求。所以第一個要先更新的是這份檔案,確保這份檔案來源即時更新。

更新方法參考這篇:How to Fix the WordPress Error 60: SSL certificate problem: certificate has expired

  1. 下載 https://curl.se/ca/cacert.pem 這份檔案
  2. 取代 WordPress 目錄下 wp-includes/certificates/ca-bundle.crt 這個檔案
  3. 完成!

到這一步,如果運氣好,你已經解決了問題。但總是還可能有其他意外!像是 WordPress 中那個發出請求的外掛或主題等程式碼,開發者並非使用 WordPress 內建的請求方法,因為沒有自帶CA憑證檔案發出請求,所以這樣問題就會回到主機作業系統端預設的CA憑證。

WordPress 外掛開發指引中有很明確地說道內建發出請求的方法。如果提交審查外掛也會根據是否有正確使用內建方法來提出外掛修正。

單一站點發生這個錯誤

可能是自簽的憑證,那就是把這憑證資訊抓下來放置就好。Shell Script 如下:

#!/bin/bash
hostname=網域名稱
port=443
trust_cert_file_location=`curl-config --ca`

sudo bash -c "echo -n | openssl s_client -showcerts -connect $hostname:$port -servername $hostname \
    2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'  \
    >> $trust_cert_file_location"

解法參考:Server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

多個站點發生這個錯誤

這種情況通常都是某一個憑證授權單位CA的憑證改版,而主機(假設使用 Ubuntu)這邊沒更新上。手動更新 ca-certificates 的 Shell Script 方法如下:

#!/bin/bash
# 確保相依使用套件有安裝
sudo apt -y install make tar xz-utils wget

# 建立一個目錄來操作
mkdir -p ~/src
cd ~/src
# 下載 ca-certificates_20211016~21.10.1 這版本(可以自行依照需求替換)來更新
wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/ca-certificates/20211016~21.10.1/ca-certificates_20211016~21.10.1.tar.xz    
tar -xJf ca-certificates_20211016~21.10.1.tar.xz

# 建立並安裝CA憑證
cd ca-certificates_20211016~21.10.1
make
sudo make install

# You might want to run this interactively to ensure
# you can select the ISRG Root X1
# in which case, just run: sudo dpkg-reconfigure ca-certificates
sudo dpkg-reconfigure -fnoninteractive ca-certificates
sudo update-ca-certificates
/usr/bin/c_rehash /etc/ssl/certs

操作參考:How to install latest ca-certificates on Ubuntu 14 [closed]

後記

找尋這個 cURL Error 60 問題的解答會出現很多不同的情境,本文引用的文章也不是都在說 WordPress 的操作情境下,所以要拆解問題找到答案是真的有難度。

更何況很多的解答甚至都還教你直接「忽視」就好,或許請求的 HTTPS 網站憑證有問題可以直接忽視不處理,但還是針對問題來逐一解決,才是了解一套系統運作的根本學習方向。

如果對 SSL 運作的大方向沒有認識,又不清楚 WordPress 有自己包裝過一層的設計,那這個問題肯定難解了。

寫這篇筆記過程中還挖掘到一個有趣的工具網站「What's My Chain Cert?」分享憑證知識與憑證鏈(Chain)產生工具。

不建議把自己網站憑證亂輸入別人網站就是


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon