cURL無法訪問TLS網站故障解決

来源:https://www.cnblogs.com/andrewwang/archive/2019/09/16/11529023.html
-Advertisement-
Play Games

大多數人都厭煩使用老舊的系統,無論軟體還是硬體。但有的時候又不得不困守其中,堅持延續著系統的壽命,或者還需要點幾柱香,祈求神佛的護佑。 Linux是一個模塊化極好的操作系統,得益於此,當其中有組件落伍之時,大多數情況下,還能通過下載源碼,手工編譯來升級組件,從而保證系統的可用性。 在這個過程中,cU ...



大多數人都厭煩使用老舊的系統,無論軟體還是硬體。但有的時候又不得不困守其中,堅持延續著系統的壽命,或者還需要點幾柱香,祈求神佛的護佑。
Linux是一個模塊化極好的操作系統,得益於此,當其中有組件落伍之時,大多數情況下,還能通過下載源碼,手工編譯來升級組件,從而保證系統的可用性。
在這個過程中,cURL工具是必不可少的,特別很多常用的開發平臺,都使用了libcurl庫作為下載的基礎工具。比如PHP/PYTHON/RUST/NPM等。當cURL出現故障的時候,直接就導致很多開發工具的升級或者安裝依賴包無法繼續。

今天碰到一個故障,一臺有些年頭的伺服器在升級一個安全組件的時候報了一個錯誤:

cURL error 35: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

字面意思上看,是ssl3在握手的時候出現了錯誤。
但實際上,如果換用一臺正常的設備訪問同樣的網站,再加上-v參數,能看到網站實際是用了TLS的加密方式:

$ curl -v https://sh.rustup.rs
* Rebuilt URL to: https://sh.rustup.rs/
*   Trying 13.225.103.123...
* TCP_NODELAY set
* Connected to sh.rustup.rs (13.225.103.123) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
    ...(略)

cURL在https的處理方面,主要依賴openssl的處理,所以實際上單純重新編譯cURL是不起作用的,必須把openssl也下載新版本重新編譯。

首先在目標伺服器上卸載掉原有的curl和openssl,並且安裝基本的編譯系統:

$ sudo apt-get purge curl libcurl3 libcurl3-gnutls libcurl4-openssl-dev openssl libssl-dev
$ sudo apt-get autoremove -y

$ sudo apt-get install build-essential libtool make

libtool make 正常情況下其實已經包含在build-essential,但仍然有個別發行版本需要單獨安裝,不過不用擔心,已經安裝過的組件反正是會自動跳過的,耽誤不了什麼時間。
在這個過程中應當慶幸apt工具並沒有依賴cURL,不然那才是一場災難 :)
不過接下來就只能換到一臺正常的電腦上工作了,因為openssl和cURL源碼的下載必須通過可用的下載工具,而通常如果openssl的版本過低,即便不用cURL,常用的wget一般也是無法工作的。
在openssl源碼的選擇上是個小坑。如果是一臺新的伺服器,當然會希望使用最新的版本,很少會有什麼相容性問題。
但在一臺老的伺服器上,操作系統版本也比較低,使用最新的版本就不一定好了。經常會碰到各種各樣的問題。這個過程很可能需要自己來嘗試,找一個儘量新,但運行沒有問題的版本。
當前在openssl官網提供下載的有三個穩定版本:1.0.2t/1.1.0l/1.1.1d,三個版本都已經支持tls,我經過測試選擇了1.1.0l,在這台伺服器能正常工作。
下載的源碼文件可以通過scp的方式拷貝到目標伺服器:

$ scp openssl-1.1.0l.tar.gz [email protected]:~/

隨後登陸到目標伺服器上:

$ tar xvf openssl-1.1.0l.tar.gz
$ cd openssl-1.1.0l
$ ./config
$ make
$ sudo make install
$ sudo echo "/usr/local/ssl/lib" >> /etc/ld.so.conf

安裝之後的測試可以通過openssl內置的s_client:

$ openssl s_client -tls1_2 -connect  sh.rustup.rs:443
CONNECTED(00000005)
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = sh.rustup.rs
verify return:1
---
Certificate chain
 0 s:CN = sh.rustup.rs
   i:C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
 1 s:C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
   i:C = US, O = Amazon, CN = Amazon Root CA 1
 2 s:C = US, O = Amazon, CN = Amazon Root CA 1
   i:C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
 3 s:C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
   i:C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFYDCCBEigAwIBAgIQCYiHqMAcId0Jd6fEfXdC8jANBgkqhkiG9w0BAQsFADBG
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg
Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0xOTA1MjkwMDAwMDBaFw0yMDA2Mjkx
MjAwMDBaMBcxFTATBgNVBAMTDHNoLnJ1c3R1cC5yczCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAN7D4NF6MP8rKvehZtNeSH19cqW5DFD+o8S3rywcyWvo
jkDrdbgxrVhCBf6DY9IlVantRrSJr3N+vmd64y13riRhZC/Q4dqL7S6lyqEtOoj+
   ...(略)

能拿到伺服器發出的公鑰表示編譯的openssl版本可以正常的工作和支持tls加密。
然後可以繼續下麵編譯cURL,否則編譯完白費時間,仍然不能用。

cURL通常使用最新版就可以,極少碰到不相容的情況。仍然在工作電腦下載,完成後scp拷貝到目標伺服器,過程略。
然後登錄到目標伺服器上:

$ tar xvf curl-7.66.0.tar.gz
$ cd curl-7.66.0
# 下麵一行顯示的指名了ssl安裝的路徑,採用預設編譯的話,openssl1.1.0l是安裝在這個目錄
# openssl1.1.1d是安裝在/usr/local,請根據自己的版本確認一下安裝路徑
# 如果確認當前只有安裝的這一個版本openssl,只需要--with-ssl參數,不附加目錄參數也是可以的
# 但通常系統中因為其它依賴openssl的軟體存在,經常有其他版本的libssl,沒有被徹底刪除,
# 這時候必須制定一個準確路徑
$ ./configure --with-ssl=/usr/local/ssl
$ make
$ sudo make install

此時的cURL已經支持TLS加密的伺服器了,但使用仍會報錯:

curl: (60) SSL certificate problem: unable to get local issuer certificate

這是因為沒有安裝ssl加密的根證書。
根證書可以在https://curl.haxx.se/ca/cacert.pem下載,建議仍在工作機下載,之後拷貝到目標伺服器。
根證書放到openssl的配置目錄,一般是:/usr/local/ssl/certs/或者/etc/ssl/certs/

之後可以正常使用了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <Window x:Class="WpfApp53.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/20... ...
  • 此處項目路徑是:C:\GetPathInfo\ ...
  • asp.net core 使用 signalR(一) Intro SignalR 是什麼? ASP.NET Core SignalR 是一個開源代碼庫,它簡化了嚮應用添加實時 Web 功能的過程。 實時 Web 功能使伺服器端代碼能夠即時將內容推送到客戶端。 SignalR 的適用對象: 需要來自服 ...
  • 如果已經看過本章節:目錄傳送門:這是目錄鴨~ 1.場景搭建: 首先我們去AssetStore逛淘寶~~~ 我淘到的是這個資源,其他好看的場景(消耗不高的都行)。 然後我們導入了這個資源後,把資源根文件夾的名字改為Select,把Demo場景文件的名字改為Selection,我這樣修改的emmm... ...
  • static void Main(string[] args) { int i = 0; Parallel.For(0, 100, (x) => { Console.WriteLine(i); i++; }); Console.WriteLine($"i is {i}"); Console.Read ...
  • 本教程僅用作個人學習,請勿用於商業獲利,造成後果自負!!! Pycharm安裝 在這插一個小話題哈,Pycharm只是一個編譯器,並不能代替Python,如果要使用Python,還是需要安裝Python的哈 1、Pycharm下載安裝 Pycharm下載 Pycharm官網:http://www.j ...
  • [TOC] 1. 概述 消息隊列可認為是一個消息鏈表,隊列中的每個消息具有如下屬性: 消息優先順序,由發送者賦予 消息數據長度,可以為0 消息數據(如果消息數據長度大於0) Posix消息隊列主要用於線程間消息的傳遞: A線程向隊列中放置消息,B線程從隊列中取出消息 A線程向隊列寫入消息之前,不需要B ...
  • 我們在虛擬機中安裝好centos後,需要手動配置網卡,得到IP。可以先配置臨時IP,然後在遠程連接軟體中配置永久IP。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...