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

[……]

閱讀更多

全景圖片容器,卷軸自動滾動至圖片中央,自製 jQuery 插件

在互動式網頁設計中,有時我們會遇到需要將全景圖片展示在容器中,並希望頁面加載時自動將滾動條調整至圖片的正中央位置。這篇文章將通過一個簡單的例子,展示如何自製一個 jQuery 插件來達成這個目的。

HTML 結構

使用了一張 Unsplash 全景的風景照片作為範例

CSS 樣式

要確保圖片可以超出其容器的寬度並觸發滾動效果,我們需要適當的 CSS 樣式。

自製 jQuery 插件

封裝成一個 jQuery 插件,使其易於在不同項目中重複使用。

使用範例

使用這個插件很簡單,您只需要選擇您的容器並調用 centerPanoramaScroll() 方法。

這個插件幫助您實現了在頁面加載時自動將橫向滾動條滾動至全景圖片中央的功能,無需進行繁瑣的計算或手動調整。

我們在 CodePen 上面看效果吧

See the Pen
Panoramic image container that automatically scrolls to the center of the image, a custom jQuery plugin.
by VECTOR.cool 威得數位 (@ann71727)
on CodePen.

透過這篇技術分享,您學到了如何利用 jQuery 插件將全景圖片容器的滾動條自動定位至圖片中央。這不僅提升了用戶體驗,也為您的網站增添了一點小巧思。這種方法適用於各種需要強調視覺中心的場景,無論是圖片展示、產品介紹,還是其他創意應用。

[……]

閱讀更多

刷新 Line 針對網址 og:image 的快取 refresh LINE URL og:image Cache

寫前有寫過一篇如何刪除Line 針對網址訊息的og:image快取,今天需要這功能時居然沒作用了,Line還是自顧自的秀出舊圖片
https://vector.cool/clear-line-url-preview-cache/

即便使用 Line 的工具 poker 刪除緩存,重新抓取已經抓到新的 og:image 圖片,但實際在 Line 貼上相同網址,一樣呈現舊圖,跟客戶解釋這是緩存過幾天就會好,但總是有瘋子客戶會瘋狂追問,為什麼還沒好,為什麼還是舊圖、什麼時候會好、好了沒,為了耳根清靜,我找到一個新方法能刷新,也許也能幫助到你

1.確定目標網頁正確設定 og:image 標籤

檢查一下,有可能真的是你的問題,那客戶罵你是剛好而已,哈,先確定是否存在這標籤,另外也要確定標籤上的連結是可以正常開啟的,當然你也可以貼到 Facebook 塗鴉牆驗證一下,如果設定正確,Facebook 將會抓到你預期要呈現的縮圖

2.在網址上加參數

假定你要刷新預覽圖片的網址為:
https://example.com
你只要在這網址上加上參數,至於參數要加什麼就隨便你,加上參數大概會長這樣
https://example.com?aaa=bbb

3.貼到 Line 上

把步驟2加上參數的網址貼到 Line 上,此時 Line 就會刷新該網址的預覽圖片了,如果成功刷新圖片了,即便目標網址移除參數後,仍然會是新的預覽圖片

試試看,看對你們有用嗎?

[……]

閱讀更多

Json code comments

Json 為純數據,簡單來說,Json現階段沒有標準註解,但沒有註解實在很不方便,所以可以用偷吃步的方式,一樣以 Key:Value 的方式呈現資料,取個像註解的Key用雙斜線開頭而Value 就是註解的文字,用以讓程式碼忽略這個資料

這種方式註解看起來像這樣:

註解在資料裡的樣子:

https://stackoverflow.com/a/244858

[……]

閱讀更多

Apache .htaccess Rewrite homepage only , not 301

在首頁網址不變的前提下,利用 Apache .htaccess 重寫首頁頁面,指定到同站某一網頁內容,而不影響其他網頁運作

使用情境:

首頁需要改版時,但新版本頁面開發/測試時但還不能正式上線,但於準上線狀態,這時可以透過這技巧,避免停機更新,快速切換首頁顯示頁面,不更動網址所以行銷追蹤碼或廣告著陸都不會有問題

[……]

閱讀更多

Social Network Service (SNS) Share Link

Facebook

  • http://www.facebook.com/share.php?u=[URL]&t=[TITLE]&pic=[IMAGE]

Twitter

  • http://twitter.com/intent/tweet?text=[TITLE]&url=[URL]&pic=[IMAGE]

Google Plus

  • https://plus.google.com/share?url=[URL]&t=[TITLE]

Pinterest

  • https://www.pinterest.com/pin/create/button/?url=[URL]&description=[TITLE]&media=[IMAGE]

Linkedin

  • https://www.linkedin.com/sharing/share-offsite/?url=[URL]&title=[TITLE]

Delicious

  • http://del.icio.us/post?url=[URL]&title=[TITLE]

Tumblr

  • http://www.tumblr.com/share?v=3&u=[URL]&t=[TITLE]

Digg

  • http://digg.com/submit?phase=2&url=[URL]&title=[TITLE]

StumbleUpon

  • http://www.stumbleupon.com/submit?url=[URL]&title=[TITLE]

Reddit

  • http://reddit.com/submit?phase=2&url=[URL]&title=[TITLE]

新浪微博

  • http://v.t.sina.com.cn/share/share.php?title=[TITLE]+[URL]&pic=[IMAGE]

QQ 空间

  • http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=[URL]

人人网

  • http://share.renren.com/share/buttonshare.do?link=[URL]&title=[TITLE]

腾讯微博

  • http://v.t.qq.com/share/share.php?url=[URL]&title=[TITLE]

https://github.com/bradvin/social-share-urls
https://chon.io/notes/social-media-sharing-link-url/

[……]

閱讀更多

Chrome 另存圖片 .jfif to .jpg

作者:丫丫爸爸學電腦
原文:https://kknews.cc/zh-tw/news/mkgrkz2.html

瀏覽器另存圖片的時候,發現保存的圖片格式是「.jfif」,而不是常見的.jpg或.png格式,以這種格式保存下來的圖片大部分軟體都不認識。那麼「.jfif」是什麼格式呢?丫丫爸爸今天就給大家分享下在「Win10」系統中如何把默認的圖片保存格式由「jfif」格式轉化為「jpg」格式。

今天丫丫爸爸要說的就是保存網頁圖片的問題,大家有沒有發現,當你在Win10系統下瀏覽網頁,並在網絡上下載的圖片時,默認格式是「jfif」?

結果圖片保存完都成為下面的樣子了:

會發現好多軟體都不支持這種圖片格式。

解決方法

首先按鍵盤的「Win鍵+R鍵」,彈出「運行」對話框,輸入「regedit」,然後點回車進入註冊表編輯器。

然後,按照下面的路徑一步步進入相應的項目,也可以直接把下面的路徑粘貼到地址欄里:
HKEY_CLASSES_ROOT\MIME\Database\Content Type\image/jpeg

再然後,右面的列表框中有個「Extension」選項,雙擊這一行點開,在「編輯字符串」對話框中,把「jfif」改為「jpg」,最後點確定就可以了。

[……]

閱讀更多

Windows 刪除已信任的https憑證、管理憑證

游標移到左下角按右鍵,是「右鍵」喔,選執行

輸入「certmgr.msc」按確定紐

開啟憑證管理的面板,左側是憑證類別,右邊是憑證,選取憑證後可以在上方控制列按下紅色叉叉的圖標刪除,也可以點擊滑鼠右鍵選刪除,來刪除已信任的憑證

參考資料:

[……]

閱讀更多

XAMPP設定Https開發環境,一鍵openssl自簽SSL憑證,配置 Apache Localhost

開發者通常都會在本地端電腦建立一個 localhost 的伺服器來模擬遠端生產環境或測試環境的狀態,進行相關程式碼的開發、測試,而 https 安全網站目前成為主流,為盡可能接近遠端伺服器,勢必本地端伺服器也需要安裝SSL憑證,筆者本地開發環境使用的是 XAMPP,所以本文主要是議介紹 XAMPP 的 https 配置,本文主要是「方便」開發為目地,而非「安全」為目地,介紹如何開發環境中設定SSL憑證,這僅適用於開發環境,切記 ! 不適用於正式生產環境。

本文 XAMPP版本為:XAMPP 7.4.8 ( Windows 64bit )

openssl 自簽憑證

本文使用的 XAMPP 版本已自帶 openssl 所以無需再另外安裝 openssl

準備工作

在 XAMPP 中的 Apache 根目錄中建立一個名為 ssl 子目錄,這目錄用來存放之後產生出來的證書檔案,目錄絕對路徑可能長得像下方這樣

複製 openssl 配置檔範例

openssl 自簽憑證需要一個配置檔,熱心網友 Adrian Suter 在 Github 上已經寫好配置檔範本,我們在剛建立的 ssl目錄中,建立一個名為 cert-template.conf 的檔案,並貼上下方範本網址中的代碼

複製 make-cert.bat 範例

熱心網友 Adrian Suter 在 Github 把 openssl 簽發憑證的流程寫成 Windows bat 檔案,簡化操作流程,克服指令障礙,非常佛心,如果配置檔配置正確,Enter,Enter,Enter一鍵就可以完成指定域的SSL憑證簽發,非常方便,開啟下方連結,並於上述的 ssl 目錄中建立一個名為 make-cert.bat 的檔案,並貼上下方網址中的代碼

執行make-cert.bat

執行 make-cert.bat 前,請確保 cert-template.conf 已同一目錄

執行 make-cert.bat,要求輸入要簽發的網域( 以 example.com 為例 )
輸入 example.com 按 Enter

再來會要求填入一些相關資料,不理它直接Enter、Enter、Enter下去就好,沒有輸入會帶預設值,因為本文介紹只是方便開發用的,不是正式環境使用,所以這些資訊並不必是真實的

當看到請按任意鍵繼續的文字,代表已經完成,下圖就是完成的截圖

此時 ssl 目錄就會多一個 example.com 的子目錄

開啟 example.com 目錄,裡面應該會有 server.crt 及 server.key 這兩個檔案,這就是憑證檔案,如果看到這兩個檔案,恭喜~憑證簽發完成! 這做法非常簡單

Windows 安裝憑證

openssl 自簽憑證沒有信任組織背書,仍會被瀏覽器標示為不安全,需要在 Windows 手動安裝信任此憑證,打開 server.crt 如下圖,按下「安裝憑證」按鈕

會跳出憑證匯入精靈,存放位置選「本機電腦」,下一步

選擇「將所有憑證放入以下存放區」,按憑證存放區的「瀏覽」按鈕

選擇「受信任的根憑證授權單位」,確定

下一步

按「完成」按鈕以完成憑證匯入

看到此彈跳視窗即匯入完成

設定 httpd-vhosts.conf

檔案位置:C:\xampp\apache\conf\extra\httpd-vhosts.conf
設定 XAMPP 的虛擬主機設定

設定 Hosts

檔案位置:C:\Windows\System32\drivers\etc
在檔案最下方加入下方這一行,將網域指向本機,流量就不出站了

完成設定

完成上述動作,再來就是要測試是否可以正常運行,在這之前先完成幾個步驟

  1. Ping 網域是否正確指向 127.0.0.1
  2. 重新啟動 XAMPP
  3. 暫時關閉防毒軟體及防火牆
  4. 清除 Windows DNS快取
  5. 清除瀏覽器 DNS 快取
  6. 瀏覽器關閉後重新開啟

最後打開瀏覽器,開啟所設定的網域,正常網址前方應該是不會出現「不安全」字樣,應該會出現鎖頭圖標,點擊網址前方鎖頭圖標,會顯示「已建立安全連線」的小視窗,如果有看到代表已經設定成功囉

如果沒看到也可以再嘗試一下多清除幾次瀏覽器的快取,或關閉瀏覽器再開啟,我發現瀏覽器這部分似乎有快取,有時設定成功卻仍顯示不安全,所以可以特別去注意這部分,若還是不行就重新操作一遍,或瀏覽文章下方參考連結參考原文

檢視或刪除已信任憑證

當我們完成階段性任務,不需要再使用開發環境某一個域的憑證時,可以參考下面這篇來刪除憑證

Windows 刪除已信任的https憑證、管理憑證

參考資料

https://shellcreeper.com/how-to-create-valid-ssl-in-localhost-for-xampp/
https://a091234765.pixnet.net/blog/post/403840004
https://gist.github.com/turtlepod/3b8d8d0eef29de019951aa9d9dcba546#file-cert-conf
https://www.cnblogs.com/kidsitcn/p/10561979.html
https://odan.github.io/2017/10/29/installing-an-ssl-certificate-under-apache-xampp.html

[……]

閱讀更多