如何修復cURL error 60: SSL certificate problem: certificate has expired問題

錯誤型別:
WP內部錯誤
錯誤名稱:
SSL证书已过期
英文名稱:
cURL error 60: SSL certificate problem: certificate has expired
錯誤描述:
WP core有一个根证书文件,/wp-includes/certificates/ca-bundle.crt用于检查通过HTTP API创建的所有请求的SSL。在此文件中,用于为您的站点创建证书的根证书之一已过期。因此,请求无法通过验证并生成此错误。

curl錯誤修復

從2021年9月30日起,HTTP API請求可能會停止在安裝了Let’s Encrypt證書的WordPress網站上工作。此前我們有提醒過大家注意Let’s Encrypt根證書將過期可能會帶來問題

例如,這樣的請求會導致錯誤:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$res = wp_remote_get( 'https://wp-kama.com/' );
if( is_wp_error( $res ) ){
echo $res->get_error_message();
}
$res = wp_remote_get( 'https://wp-kama.com/' ); if( is_wp_error( $res ) ){ echo $res->get_error_message(); }
$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上檢視相應的提交

手動替換內容更新以解決問題

  1. 下載此檔案https://curl.se/ca/cacert.pem
  2. 使用上述下載以更新/wp-includes/certificates/ca-bundle.crt的內容。
  3. Done!報錯將會銷聲匿跡。

或新增程式碼片段以修復報錯

當您能夠從管理面板執行程式碼時,使用程式碼會很方便,例如使用程式碼片段外掛。

  1. 將以下程式碼新增到 themes functions.php 檔案中(或在 Code Snippets 外掛中):
    Plain text
    Copy to clipboard
    Open code in new window
    EnlighterJS 3 Syntax Highlighter
    /**
    * 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;
    }

    使用後,刪除此程式碼。

  2. 訪問http://YOURSITE.com/?update-wp-ca-bundle頁面。(替換YOURSITE.com到您的域名…)
  3. Done!一切都應該像以前一樣工作。

評論留言