- 錯誤型別:
- WP內部錯誤
- 錯誤名稱:
- SSL证书已过期
- 英文名稱:
- cURL error 60: SSL certificate problem: certificate has expired
- 錯誤描述:
- WP core有一个根证书文件,/wp-includes/certificates/ca-bundle.crt用于检查通过HTTP API创建的所有请求的SSL。在此文件中,用于为您的站点创建证书的根证书之一已过期。因此,请求无法通过验证并生成此错误。
從2021年9月30日起,HTTP API請求可能會停止在安裝了Let’s Encrypt證書的WordPress網站上工作。此前我們有提醒過大家注意Let’s Encrypt根證書將過期可能會帶來問題。
例如,這樣的請求會導致錯誤:
$res = wp_remote_get( 'https://wp-kama.com/' ); if( is_wp_error( $res ) ){ echo $res->get_error_message(); }
然後你就會遭遇下方的報錯提示:
cURL error 60: SSL certificate problem: certificate has expired
這樣的錯誤將隨處可見,例如:
- 在WP管理面板檢查WordPress更新時。
- 檢查外掛更新時。
- 訪問任何服務的api時。例如,TinyPNG影象壓縮以及其他一些使用任何型別請求的外掛。
為什麼我們看到錯誤證書已過期?
簡而言之,WP core有一個根證書檔案,/wp-includes/certificates/ca-bundle.crt
用於檢查通過HTTP API建立的所有請求的SSL。在此檔案中,用於為您的站點建立證書的根證書之一已過期。因此,請求無法通過驗證並生成此錯誤。
更詳細的解釋:
在不詳細介紹的情況下,對於非專業人士來說幾句關於為什麼到期
DST Root CA X3
證書將影響Let’s Encrypt頒發的證書。每個驗證證書的系統都有自己的可信根證書儲存庫。系統將信任在驗證期間使用這些根證書之一的私鑰簽名的證書。根證書本身通常有很長的到期日期,很少更改並且在生成最終主題證書(在這種情況下是域名證書)時不使用,相反,公鑰基礎設施意味著使用信任鏈 – 根證書用於簽署中間證書和已經使用它們來簽署最終主題證書(域證書)。此外,為了讓系統信任最終主題證書,它必須能夠跟蹤從該證書到它信任的根證書之一的完整鏈。當Let’s Encrypt出現時,它的
ISRG Root X1
根證書(就像任何新的根證書一樣)無法快速進入大量系統的受信任證書庫。同時,為了專案的成功執行,從一開始就頒發的證書必須受到最大數量的“開箱即用”系統的信任(這些系統的使用者沒有任何額外的操作)。在這方面,對於證書,Let’s Encrypt開始使用通向根證書的信任鏈DST Root CA X3
,這是大多數系統認可的。
隨著下一次WP更新,此錯誤將會自行消失,但如果您今天需要解決方案,或者您不打算更新WordPress,但需要有效的HTTP請求,請執行以下操作。
cURL error 60: SSL certificate has expired解決辦法
您需要更新/wp-includes/certificates/ca-bundle.crt
檔案的內容,將其更改為https://curl.se/ca/cacert.pem檔案的內容。
在這種情況下更改核心檔案是可以接受的,因為下次更新WP時,問題就會消失。你可以在GitHub上檢視相應的提交。
手動替換內容更新以解決問題
- 下載此檔案https://curl.se/ca/cacert.pem。
- 使用上述下載以更新
/wp-includes/certificates/ca-bundle.crt
的內容。 - Done!報錯將會銷聲匿跡。
或新增程式碼片段以修復報錯
當您能夠從管理面板執行程式碼時,使用程式碼會很方便,例如使用程式碼片段外掛。
- 將以下程式碼新增到 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;}/** * 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; }
/** * 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
到您的域名…) - Done!一切都應該像以前一樣工作。
評論留言