PHP cURL Error: Peer reports incompatible or unsupported protocol version.

PHP cURL 遇到的錯誤:cURL Error: Peer reports incompatible or unsupported protocol version.,探討解決方案。

範例程式碼

以下是我使用的範例程式碼,用於向 API Server 傳送資料:

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_DEFAULT);
// 執行 cURL 請求
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch) . "\n";
} else {
echo "Response:\n";
echo $response;
}

此程式碼導致錯誤,因為主機與 API Server 支援的 SSL/TLS 協議不匹配。

系統環境

發生原因

檢查 OpenSSL 版本後發現,OpenSSL 1.0.2k-fips 只支持到 TLS 1.2,但目標 API Server 僅允許 TLS 1.3。這就導致了協議不匹配,從而引發了錯誤。

OpenSSL 1.0.2k-fips 支援的 SSL/TLS 協議:

因為 OpenSSL 1.0.2 不支持 TLS 1.3,而 API Server 僅允許 TLS 1.3,導致 SSL/TLS 協議不兼容。

解決方案

1. 升級主機的 SSL/TLS 支援

若 API Server 僅支援 TLS 1.3,主機必須升級至支援 TLS 1.3 的 OpenSSL 版本(至少為 OpenSSL 1.1.1)。這樣可以確保 PHP 主機與 API Server 之間的 SSL/TLS 協議匹配。

2. 讓 API Server 向下兼容 TLS 1.2

如果 API Server 能夠向下兼容 TLS 1.2,則可以暫時允許 TLS 1.2 通訊,以解決當前的不兼容問題。儘管 TLS 1.3 更加安全,但在過渡期間允許使用 TLS 1.2,可以確保現有系統正常運行。

實作過程

在我的情況下,由於主機當前無法即時升級至支援 TLS 1.3 的 OpenSSL,我選擇了讓 API Server 向下兼容 TLS 1.2 的方案。這樣系統可以恢復運作,並且在未來 OpenSSL 升級至支援 TLS 1.3 時,再切換至僅支持 TLS 1.3 的模式。

在 Plesk 中,可以使用以下命令來啟用 TLS 1.2 和 TLS 1.3:

# plesk bin server_pref -u -ssl-protocols 'TLSv1.2 TLSv1.3'

執行此命令後,請重啟相關服務(如 Apache、Nginx、PHP-FPM)以應用更改。
這樣可以臨時解決協議不兼容的問題。

檢測工具

SSL Labs

當不確定目標主機支援哪些 TLS 協議版本時,可以使用 SSL Labs 工具來檢查目標主機的 TLS 支援情況。該工具可以幫助你確定目標主機的協議支援,從而避免不兼容問題的發生。

參考資料

https://www.plesk.com/kb/support/how-to-enable-disable-tls-protocol-versions-in-plesk-for-linux/
https://talk.plesk.com/threads/best-practice-for-upgrading-openssl-on-centos-7-9-obsidian-v18-0-54.371042/
https://www.isres.com/jingyan2/79.html
https://blog.csdn.net/weixin_46858088/article/details/135718447

[……]

閱讀更多

WordPress wp_remote_post curl: (35) Peer reports incompatible or unsupported protocol version

分享如何處理使用 WordPress 的 wp_remote_post() 函數時遇到的錯誤:curl: (35) Peer reports incompatible or unsupported protocol version,探討解決方案。

範例程式碼

以下是我使用的範例程式碼,用於向 API Server 傳送資料:

$crm_api_url = 'https://crm.example.com/api/hello';
$response = wp_remote_post( $crm_api_url, [
'body' => $post_body,
]);
wp_die( print_r( $response, true ) );

此程式碼導致錯誤,因為主機與 API Server 支援的 SSL/TLS 協議不匹配。

系統環境

發生原因

檢查 OpenSSL 版本後發現,OpenSSL 1.0.2k-fips 只支持到 TLS 1.2,但目標 API Server 僅允許 TLS 1.3。這就導致了協議不匹配,從而引發了錯誤。

OpenSSL 1.0.2k-fips 支援的 SSL/TLS 協議:

因為 OpenSSL 1.0.2 不支持 TLS 1.3,而 API Server 僅允許 TLS 1.3,導致 SSL/TLS 協議不兼容。

解決方案

1. 升級主機的 SSL/TLS 支援

若 API Server 僅支援 TLS 1.3,主機必須升級至支援 TLS 1.3 的 OpenSSL 版本(至少為 OpenSSL 1.1.1)。這樣可以確保 WordPress 主機與 API Server 之間的 SSL/TLS 協議匹配。

2. 讓 API Server 向下兼容 TLS 1.2

如果 API Server 能夠向下兼容 TLS 1.2,則可以暫時允許 TLS 1.2 通訊,以解決當前的不兼容問題。儘管 TLS 1.3 更加安全,但在過渡期間允許使用 TLS 1.2,可以確保現有系統正常運行。

實作過程

在我的情況下,由於主機當前無法即時升級至支援 TLS 1.3 的 OpenSSL,我選擇了讓 API Server 向下兼容 TLS 1.2 的方案。這樣系統可以恢復運作,並且在未來 OpenSSL 升級至支援 TLS 1.3 時,再切換至僅支持 TLS 1.3 的模式。

在 Plesk 中,可以使用以下命令來啟用 TLS 1.2 和 TLS 1.3:

# plesk bin server_pref -u -ssl-protocols 'TLSv1.2 TLSv1.3'

執行此命令後,請重啟相關服務(如 Apache、Nginx、PHP-FPM)以應用更改。
這樣可以臨時解決協議不兼容的問題。

檢測工具

SSL Labs

當不確定目標主機支援哪些 TLS 協議版本時,可以使用 SSL Labs 工具來檢查目標主機的 TLS 支援情況。該工具可以幫助你確定目標主機的協議支援,從而避免不兼容問題的發生。

參考資料

https://www.plesk.com/kb/support/how-to-enable-disable-tls-protocol-versions-in-plesk-for-linux/
https://talk.plesk.com/threads/best-practice-for-upgrading-openssl-on-centos-7-9-obsidian-v18-0-54.371042/
https://www.isres.com/jingyan2/79.html
https://blog.csdn.net/weixin_46858088/article/details/135718447

[……]

閱讀更多

Plesk Onyx on CentOS 7 AWS AMI 一鍵安裝

有什麼比一鍵安裝更快樂呢

千呼萬喚始出來,AWS有Plesk官方的AMI囉!千呼萬喚始出來,AWS有Plesk官方的AMI囉!

相信很多接觸過虛擬主機的人都應該用過Plesk,Plesk是一套主流的主機管理系統,雖然cpanal也是主流的主機管理系統,但我還是習慣使用Plesk,可能是介面比較漂亮吧,以貌取程式,之前要在AWS上安裝還要從OS一個一個裝,慢慢去調校,期待有沒有AMI的解決方案,Plesk官方發布了一篇新文章,裡面有提到已經可以透過AWS AMI一鍵安裝AWS環境及Plesk

作業系統版本

提供3種不同作業系統的映像檔

OS
AWS AMI

CentOS

Plesk Onyx on CentOS 7 (Webhost)

Ubuntu

Plesk Onyx on Ubuntu 16.04 (WebHost)

Windows

Plesk Onyx on Windows 2012 R2 (WebHost)

Plesk十天試用

AWS AMI Plesk十天試用

預先配置

講簡單一點就是都幫你配好好的拉,你只要點一下就好

預先安裝的 Plesk Extensions

  • Plesk Premium郵件由Kolab提供 – 安全的業務類電子郵件和協作工具,最多10個郵箱
  • Plesk電子郵件安全包(卡巴斯基AV / Magicspam) – 保護您的電子郵件
  • Plesk防火牆保護
  • ModSecurity  – 保護您的服務器免受惡意攻擊
  • Symantec免費SSL證書(基本) – 來自全球安全領導者的網站安全*
  • WordPress工具包 – 只需點擊幾下即可在單個服務器上大量管理多個WordPress實例
  • Plesk安全顧問 – 如果你不是安全專家,這個嚮導是!
  • Amazon Route 53 DNS
  • Boldgrid  – 快速,輕鬆的網站建設者在WordPress之上工作*

預配置為性能和安全性

  • 服務提供商視圖
  • 開啟防火牆
  • 使用Atomicorp的基本規則開啟Web應用程序防火牆
  • 開啟Fail2Ban禁用IP地址過濾
  • PHP 7-FPM(FastCGI Process Manager)
  • 由NGINX服務

如果你是AWS新用戶,還送你 $500 美金 AWS credits

Plesk on AWS

[……]

閱讀更多

Plesk 設定排程任務,定時瀏覽指定網頁

Plesk是一套很方便的主機系統管理程式,也是主流主機管理程式之一,很多主機商也都用Plesk來進行主機系統管理,本篇要介紹如何設定排程任務

什麼是排程任務?

有時我們在寫程式的時候會希望主機自動在某一個時間區間執行某些任務,例如:每日午夜12:00,進行購物車訂單出貨拋轉作業,當然也可以人工每天12點去瀏覽這支程式,只是非常愚蠢,偷懶是工程師的美德,於是我們需要一個像計時器的東西,時間到去做某些動作,達成自動化目的。

建立任務處理程式

我習慣會寫一支程式,專門執行某些特定任務,比如說:購物車訂單出貨拋轉作業,這支程式可透過瀏覽網頁的方式去驗證是否正常運行,確定一切都正常,接著我們需要一個觸發程式的瀏覽者,這我們就透過Plesk的排程任務達成。

設定Plesk

登入Plesk ,到指定網域的管理頁面,右上角有一個叫計畫的任務
PS. 如果您的Plesk管理面板中沒出現這個選單,那就是這功能管理者沒開放,就需聯絡你的主機商,如果他們不願意開這功能就換家主機商吧。
登入Plesk ,到指定網域的管理頁面,右上角有一個叫計畫的任務

添加一個任務

設定執行時間

  1. 我選擇獲取URL選項,讓Plesk排程任務,在指定時間瀏覽我的某一支檔案。
  2. 輸入要執行的檔案URL
  3. 設定時間及週期
  4. 發送通知,可以選擇僅發送異常通知就好
  5. 選擇通知對象
  6. 儲存

驗證

  1. 設定完成後,一定要檢查是否有在指定時間及周期中執行,可以寫個小程式,去紀錄執行時間,以驗證程式有正常運行。
  2. 承上點,若你確定你的程式運行完全正常沒有問題,但排程卻沒正常運行,請檢查排程設定,若也都沒錯,請聯絡主機商。

安全設定

  1. 眼尖的朋友應該會看到我的執行URL加了個c參數,後面跟了一堆亂碼,這是一個簡單的安全設定,為了避免爬蟲或有心人士,在非排程定義執行區間去執行此程式,所做的驗證機制,在我的php檔最前方加入下方程式碼,若沒有正確的key,此頁將返回hTTP 404錯誤,當作根本就沒這頁的存在
    <?php
    if($_GET['c']!='B598FCD1B61E79D8249C5A8AAEC2D585'){
    header("HTTP/1.0 404 Not Found");
    exit;
    }
  2. 設定 .htaccess 檔,該URL只允許執行某一 IP執行
    RewriteEngine On
    RewriteCond %{REMOTE_ADDR} !=123.123.123.123
    RewriteCond %{REQUEST_URI} ^/basic/test.php [NC]
    RewriteRule ^ - [R=404,L]

    參考資料:

[……]

閱讀更多