curl SSL、TLS 與代理設定指南
在 curl 中設定 HTTPS 憑證、TLS 版本、代理和自訂 DNS 解析對於安全 API 通訊、CI/CD 管線和除錯網路問題至關重要。本指南涵蓋所有 SSL、TLS、代理和網路選項——從使用 -k 停用憑證檢查用於本機開發,到使用 --cert 設定雙向 TLS 以及透過 SOCKS5 代理路由流量。每個選項都包含清晰的說明、安全考量事項和可直接複製的範例。
SSL 與代理選項快速參考
允許不安全連線——跳過所有 SSL 驗證
使用特定 CA 套件驗證伺服器憑證
提供用戶端憑證用於雙向 TLS 驗證
提供用戶端憑證的私密金鑰檔案
連線使用 TLS 1.2 或更高版本
連線使用 TLS 1.3 或更高版本
要求連線使用 SSL/TLS(不可用時失敗)
指定連線使用的 SSL 密碼套件
指定用戶端憑證類型(PEM、DER、ENG、P12)
固定並驗證伺服器公開金鑰(HPKP 風格)
將所有流量透過指定代理伺服器路由
透過 SOCKS5 代理路由連線
提供代理伺服器的使用者名稱:密碼
不應透過代理的主機清單
透過代理進行 DNS 解析的 SOCKS5 代理
用於驗證 HTTPS 代理本身的 CA 憑證
將特定 host:port 對映射到自訂 IP 位址
連線到與 URL 指定不同的 host:port
設定連線的本機連接埠號或範圍
將連線繫結到特定網路介面
使用自訂 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/datacurl --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/securecurl --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/securecurl --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/TLS(不可用時失敗)
指定連線使用的 SSL 密碼套件
指定用戶端憑證類型(PEM、DER、ENG、P12)
固定並驗證伺服器公開金鑰(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/datacurl --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/datacurl --proxy-user:代理驗證
- 功能說明
--proxy-user(或-U)選項向代理伺服器傳送驗證憑據。格式為user:password。這與伺服器驗證(-u)是分開的。- 使用時機
- 當代理伺服器要求驗證時必需——在企業網路環境中很常見。憑據傳送到代理,而非目標伺服器。
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/datacurl --noproxy:對特定主機繞過代理
- 功能說明
--noproxy選項指定以逗號分隔的主機、網域或 IP 位址清單,這些位址應繞過代理直接連線。支援萬用字元:*.example.com比對所有子網域。- 使用時機
- 用於將 localhost、內部服務或特定網域排除在代理之外。當代理透過環境變數全域設定但某些主機(如本機服務)需要直接存取時很重要。使用
*對所有主機繞過代理。
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api其他代理選項
透過代理進行 DNS 解析的 SOCKS5 代理
用於驗證 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/healthcurl --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其他網路選項
設定連線的本機連接埠號或範圍
將連線繫結到特定網路介面
使用自訂 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/statuscurl SSL 與代理常見問題
如何在 curl 中跳過 SSL 憑證驗證?
使用 curl -k URL 或 curl --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_proxy 和 https_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 憑證。