curl SSL、TLS 與代理設定指南

curl 中設定 HTTPS 憑證、TLS 版本、代理和自訂 DNS 解析對於安全 API 通訊、CI/CD 管線和除錯網路問題至關重要。本指南涵蓋所有 SSL、TLS、代理和網路選項——從使用 -k 停用憑證檢查用於本機開發,到使用 --cert 設定雙向 TLS 以及透過 SOCKS5 代理路由流量。每個選項都包含清晰的說明、安全考量事項和可直接複製的範例。

SSL 與代理選項快速參考

-kSSL/TLS

允許不安全連線——跳過所有 SSL 驗證

--cacertSSL/TLS

使用特定 CA 套件驗證伺服器憑證

--certSSL/TLS

提供用戶端憑證用於雙向 TLS 驗證

--keySSL/TLS

提供用戶端憑證的私密金鑰檔案

--tlsv1.2SSL/TLS

連線使用 TLS 1.2 或更高版本

--tlsv1.3SSL/TLS

連線使用 TLS 1.3 或更高版本

--ssl-reqdSSL/TLS

要求連線使用 SSL/TLS(不可用時失敗)

--ciphersSSL/TLS

指定連線使用的 SSL 密碼套件

--cert-typeSSL/TLS

指定用戶端憑證類型(PEM、DER、ENG、P12)

--pinnedpubkeySSL/TLS

固定並驗證伺服器公開金鑰(HPKP 風格)

-x代理

將所有流量透過指定代理伺服器路由

--socks5代理

透過 SOCKS5 代理路由連線

提供代理伺服器的使用者名稱:密碼

--noproxy代理

不應透過代理的主機清單

--socks5-hostname代理

透過代理進行 DNS 解析的 SOCKS5 代理

--proxy-cacert代理

用於驗證 HTTPS 代理本身的 CA 憑證

--resolve網路

將特定 host:port 對映射到自訂 IP 位址

連線到與 URL 指定不同的 host:port

--local-port網路

設定連線的本機連接埠號或範圍

--interface網路

將連線繫結到特定網路介面

--dns-servers網路

使用自訂 DNS 伺服器替代系統預設值(c-ares)

curl -k:忽略 SSL 憑證錯誤

功能說明
-k(或 --insecure)選項停用所有 SSL/TLS 憑證驗證。curl 不會檢查伺服器憑證是否由受信任的 CA 簽署、主機名稱是否相符或憑證是否已過期。
使用時機
用於使用自簽憑證的本機開發或測試環境。對於預發布/正式環境,請改用 --cacert 加實際 CA 憑證——更安全也更明確。
$ curl -k https://localhost:8443/api/health

切勿在正式環境腳本或 CI/CD 管線中使用 -k。它停用所有憑證驗證,使您的連線容易遭受中間人攻擊。請改用 --cacert 信任特定 CA。

curl --cacert:使用自訂 CA 憑證

功能說明
--cacert 選項告訴 curl 使用特定的 PEM 格式 CA(憑證授權單位)套件檔案驗證伺服器的 SSL 憑證,而非系統預設的信任存放區。
使用時機
當您的伺服器使用不在系統信任存放區中的私有或內部 CA 簽署的憑證時使用。這在企業環境、Kubernetes 叢集和使用內部 PKI 的 Docker 設定中很常見。
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert:用戶端憑證(雙向 TLS)

功能說明
--cert 選項提供用戶端憑證用於雙向 TLS(mTLS)。在 mTLS 中,伺服器和用戶端都需要提供憑證來驗證對方身分。憑證檔案應為 PEM 或 PKCS#12 格式。
使用時機
當伺服器要求用戶端憑證驗證時必需——常見於銀行 API、政府服務、IoT 裝置通訊和零信任架構。除非金鑰已嵌入憑證檔案,否則始終與 --key 搭配使用。
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key:用戶端憑證私密金鑰

功能說明
--key 選項指定與 --cert 提供的用戶端憑證配對的私密金鑰檔案。金鑰必須與憑證相符。如果金鑰受密碼保護,curl 將提示輸入密碼(或使用 --pass)。
使用時機
始終與 --cert 一起使用。如果私密金鑰已嵌入憑證檔案中(PKCS#12 / .p12 檔案常見此情況),可省略 --key
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2:強制最低 TLS 1.2

功能說明
--tlsv1.2 選項強制 curl 使用 TLS 1.2 作為 SSL/TLS 交握的最低可接受版本。較舊的協定(TLS 1.0、1.1、SSLv3)將被拒絕。
使用時機
用於強制執行最低安全標準。TLS 1.2 是 PCI-DSS 合規所必需的,所有現代伺服器都支援。大多數現代 curl 建置預設已使用 TLS 1.2+,但此選項使其明確化。
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3:強制最低 TLS 1.3

功能說明
--tlsv1.3 選項強制 curl 使用 TLS 1.3——最快速、最安全的 TLS 版本。TLS 1.3 消除了交握中的額外往返(支援 0-RTT)並移除了所有過時的密碼套件。
使用時機
當您知道伺服器支援 TLS 1.3 且想要最佳效能和安全性時使用。注意:TLS 1.3 需要 OpenSSL 1.1.1+ 或相容的 TLS 程式庫。尚未所有伺服器都支援。
$ curl --tlsv1.3 https://modern-api.example.com/data

其他 SSL/TLS 選項

--ssl-reqd

要求連線使用 SSL/TLS(不可用時失敗)

--ciphers

指定連線使用的 SSL 密碼套件

--cert-type

指定用戶端憑證類型(PEM、DER、ENG、P12)

--pinnedpubkey

固定並驗證伺服器公開金鑰(HPKP 風格)

curl -x:使用 HTTP/HTTPS 代理

功能說明
-x(或 --proxy)選項將所有 curl 流量透過指定代理伺服器路由。格式為 [protocol://]host[:port]。支援的代理協定:HTTP、HTTPS、SOCKS4、SOCKS5。
使用時機
用於企業代理伺服器、使用 Fiddler、Charles 或 mitmproxy 等工具除錯、測試地理限制,或無法直接存取網際網路時。也可以設定 http_proxy / https_proxy 環境變數替代。
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5:使用 SOCKS5 代理

功能說明
--socks5 選項告訴 curl 使用 SOCKS5 代理進行 TCP 連線。與 HTTP 代理不同,SOCKS5 在 TCP 層運作,可以處理任何協定——不僅是 HTTP。預設情況下 DNS 在本機解析;使用 --socks5-hostname 透過代理解析 DNS。
使用時機
用於 SSH 通道(ssh -D)、Tor 網路存取,或代理必須處理非 HTTP 協定時。SOCKS5 支援 UDP 並可選擇性處理 DNS——使其比 HTTP 代理更靈活。
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user:代理驗證

功能說明
--proxy-user(或 -U)選項向代理伺服器傳送驗證憑據。格式為 user:password。這與伺服器驗證(-u)是分開的。
使用時機
當代理伺服器要求驗證時必需——在企業網路環境中很常見。憑據傳送到代理,而非目標伺服器。
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy:對特定主機繞過代理

功能說明
--noproxy 選項指定以逗號分隔的主機、網域或 IP 位址清單,這些位址應繞過代理直接連線。支援萬用字元:*.example.com 比對所有子網域。
使用時機
用於將 localhost、內部服務或特定網域排除在代理之外。當代理透過環境變數全域設定但某些主機(如本機服務)需要直接存取時很重要。使用 * 對所有主機繞過代理。
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

其他代理選項

--socks5-hostname

透過代理進行 DNS 解析的 SOCKS5 代理

--proxy-cacert

用於驗證 HTTPS 代理本身的 CA 憑證

curl --resolve:自訂 DNS 解析

功能說明
--resolve 選項為特定 host:port 對提供自訂 IP 位址,完全繞過 DNS 查詢。格式為 host:port:address。可提供多個 --resolve 項目。
使用時機
在 DNS 傳播之前測試、驗證負載平衡器後面的特定後端,或需要真實主機名稱進行 SSL 憑證驗證的本機開發中非常重要。與編輯 /etc/hosts 不同,這是按請求和連接埠特定的。
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to:將連線重新導向到不同主機

功能說明
--connect-to 選項將 TCP 連線重新導向到不同的 host:port 對,同時保留原始 URL 用於 HTTP 請求(包括 Host 標頭和 SNI)。格式:HOST1:PORT1:HOST2:PORT2
使用時機
用於在不修改 DNS 或 /etc/hosts 的情況下測試負載平衡器後面的特定後端伺服器。與 --resolve 不同,這將 host:port 映射到 host:port(而非 IP),當目標也有主機名稱時很有用。
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

其他網路選項

--local-port

設定連線的本機連接埠號或範圍

--interface

將連線繫結到特定網路介面

--dns-servers

使用自訂 DNS 伺服器替代系統預設值(c-ares)

實際 SSL 與代理情境

這些範例組合多個選項來處理開發、CI/CD 和正式環境中常見的安全和網路任務。

在 Localhost 上測試 HTTPS

使用自簽憑證進行本機開發時,將 --resolve--cacert(或快速測試使用 -k)組合。這讓您可以使用真實主機名稱進行正確的 SSL/SNI 而無需修改 hosts 檔案。

$ curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/api/status

雙向 TLS(用戶端憑證驗證)

某些 API 要求伺服器和用戶端都提供憑證。提供 --cert--key--cacert 來建立完全驗證的雙向 TLS 連線。

$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://mtls-api.example.com/data

帶驗證的企業代理

在有強制代理伺服器的企業網路中,將 -x-U 組合提供代理憑據。新增 --noproxy 將內部服務排除在代理之外。

$ curl -x http://proxy.corp.com:3128 -U user:pass --noproxy "*.internal.corp" https://external-api.com/data

使用內部 CA 的 Docker 容器

當 Docker 中的服務使用來自內部 CA 的憑證時,將 CA 憑證掛載到容器中並透過 --cacert 參照。這比 -k 更安全,因為它仍然驗證憑證鏈。

$ curl --cacert /etc/ssl/certs/internal-ca.crt https://service.docker.internal:8443/health

透過 SSH 通道的 SOCKS5 代理

使用 ssh -D 建立 SOCKS5 代理,並使用 --socks5 透過它路由 curl 流量。這對於透過堡壘主機存取內部服務很有用。

$ curl --socks5 localhost:1080 https://internal-api.example.com/status

curl SSL 與代理常見問題

如何在 curl 中跳過 SSL 憑證驗證?

使用 curl -k URLcurl --insecure URL。這將停用所有憑證檢查——過期、主機名稱不相符、不受信任的 CA。用於本機開發。正式環境請使用 --cacert 加實際 CA 憑證。

如何讓 curl 信任自簽憑證?

使用 curl --cacert /path/to/ca.pem URL 指定簽署您自簽憑證的 CA 憑證。這比 -k 更安全,因為它仍然驗證憑證鏈——只信任您的特定 CA。

如何檢查 curl 正在使用哪個 TLS 版本?

執行 curl -v URL 並在詳細輸出中尋找 * SSL connection using TLSv1.x / CipherSuite 行。要強制使用特定版本,使用 --tlsv1.2--tlsv1.3

什麼是雙向 TLS(mTLS),如何在 curl 中使用?

雙向 TLS 要求伺服器和用戶端都提供憑證。使用:curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL--cert/--key 對驗證用戶端;--cacert 驗證伺服器。

如何透過 HTTP 代理使用 curl?

使用 curl -x http://proxy:port URL。HTTPS 代理:curl -x https://proxy:port URL。也可以設定 http_proxyhttps_proxy 環境變數——curl 會自動辨識。

如何將 curl 與 SOCKS5 代理一起使用?

本機 DNS 解析使用 curl --socks5 host:port URL,透過代理解析 DNS 使用 curl --socks5-hostname host:port URL(對隱私/Tor 很重要)。SSH 通道範例:ssh -D 1080 user@bastion,然後 curl --socks5 localhost:1080 URL

如何在 curl 中對代理伺服器進行驗證?

使用 curl -x http://proxy:port -U user:password URL-U(或 --proxy-user)選項將憑據傳送到代理。這與 -u 不同,後者是對目標伺服器進行驗證。

如何在 curl 中將某些主機排除在代理之外?

使用 --noproxy "localhost,127.0.0.1,*.internal.com" 或設定 NO_PROXY 環境變數。支援萬用字元(*.example.com)。使用 --noproxy "*" 對單一請求完全繞過代理。

如何用 curl 在 localhost 上測試 HTTPS?

快速測試:curl -k https://localhost:8443/。正確驗證:curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/--resolve 方式讓憑證主機名稱正確相符。

如何在 curl 中覆寫特定主機的 DNS 解析?

使用 curl --resolve host:port:IP URL。範例:curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/。這僅繞過該 host:port 對的 DNS——無需編輯 /etc/hosts

如何修復 curl 中 'SSL certificate problem: certificate has expired' 錯誤?

伺服器憑證已過期。解決方案:(1) 在伺服器上續期憑證,(2) 更新 CA 套件:curl --cacert /path/to/updated-ca.pem URL,(3) 僅測試用:curl -k URL。檢查到期時間:curl -v URL 2>&1 | grep expire

在正式環境中使用 curl --insecure (-k) 安全嗎?

不安全。-k 選項停用所有憑證驗證——過期、主機名稱和信任鏈。這使您的連線容易遭受中間人攻擊。在正式環境和 CI/CD 管線中始終使用 --cacert 加特定 CA 憑證。