從2021年9月30日起,HTTP API請求可能會在安裝了Let’s Encrypt證書的WordPress網(wǎng)站上停止工作。
例如,這樣的請求會導致錯誤:
$res = wp_remote_get( 'https://abcdef.com/' );
if( is_wp_error( $res ) ){
echo $res->get_error_message();
}
然后你就會遭遇下方的報錯提示:
cURL error 60: SSL certificate problem: certificate has expired

這樣的錯誤將隨處可見,例如:
- 在WP管理面板檢查WordPress更新時。
- 檢查插件更新時。
- 訪問任何服務(wù)的api時。例如,TinyPNG圖像壓縮以及其他一些使用任何類型請求的插件。
為什么出現(xiàn)證書已過期錯誤?
簡而言之,WP core有一個根證書文件,/wp-includes/certificates/ca-bundle.crt用于檢查通過HTTP API創(chuàng)建的所有請求的SSL。在此文件中,用于為您的站點創(chuàng)建證書的根證書之一已過期。因此,請求無法通過驗證并生成此錯誤。
更詳細的解釋:
在不詳細介紹的情況下,對于非專業(yè)人士來說幾句關(guān)于為什么到期
DST Root CA X3證書將影響Let’s Encrypt頒發(fā)的證書。每個驗證證書的系統(tǒng)都有自己的可信根證書存儲庫。系統(tǒng)將信任在驗證期間使用這些根證書之一的私鑰簽名的證書。根證書本身通常有很長的到期日期,很少更改并且在生成最終主題證書(在這種情況下是域名證書)時不使用,相反,公鑰基礎(chǔ)設(shè)施意味著使用信任鏈 – 根證書用于簽署中間證書和已經(jīng)使用它們來簽署最終主題證書(域證書)。此外,為了讓系統(tǒng)信任最終主題證書,它必須能夠跟蹤從該證書到它信任的根證書之一的完整鏈。當Let’s Encrypt出現(xiàn)時,它的
ISRG Root X1根證書(就像任何新的根證書一樣)無法快速進入大量系統(tǒng)的受信任證書庫。同時,為了項目的成功運行,從一開始就頒發(fā)的證書必須受到最大數(shù)量的“開箱即用”系統(tǒng)的信任(這些系統(tǒng)的用戶沒有任何額外的操作)。在這方面,對于證書,Let’s Encrypt開始使用通向根證書的信任鏈DST Root CA X3,這是大多數(shù)系統(tǒng)認可的。
隨著下一次WP更新,比如 WordPress 5.9,此錯誤將會自行消失,但如果您今天需要解決方案,或者您不打算更新WordPress,但需要有效的HTTP請求,請執(zhí)行以下操作。
cURL error 60: SSL certificate has expired 解決辦法
您需要更新/wp-includes/certificates/ca-bundle.crt文件的內(nèi)容,將其更改為https://curl.se/ca/cacert.pem文件的內(nèi)容。
在這種情況下更改核心文件是可以接受的,因為下次更新WP時,問題就會消失。
手動替換內(nèi)容更新以解決問題
- 下載此文件 https://curl.se/ca/cacert.pem。
- 使用上述下載以更新
/wp-includes/certificates/ca-bundle.crt的內(nèi)容。 - 好了,報錯將不再出現(xiàn)。
或添加代碼片段來修復報錯
當您能夠從管理面板運行代碼時,使用代碼會很方便,例如使用Code Snippets插件。
1、將以下代碼添加到 themes functions.php 文件中(或在 Code Snippets 插件中)
/**
* Goto http://yoursite.com/?update-wp-ca-bundle
*/
if( isset( $_GET['update-wp-ca-bundle'] ) ){
$crt_file = ABSPATH . WPINC . '/certificates/ca-bundle.crt';
$new_crt_url = 'http://curl.haxx.se/ca/cacert.pem';
if( is_writable( $crt_file ) ){
$new_str = file_get_contents( $new_crt_url );
if( $new_str && strpos( $new_str, 'Bundle of CA Root Certificates' ) ){
$up = file_put_contents( $crt_file, $new_str );
echo $up ? 'OK: ca-bundle.crt updated' : 'ERROR: can`t put data to ca-bundle.crt';
}
else {
echo 'ERROR: can\'t download curl.haxx.se/ca/cacert.pem';
}
}
else {
echo 'ERROR: ca-bundle.crt not writable';
}
exit;
}
使用后,刪除此代碼。
訪問http://yoursite.com/?update-wp-ca-bundle頁面。(替換 yoursite.com 為您的域名…)
好了,一切都恢復正常啦。




