Hướng dẫn cấu hình curl SSL, TLS & Proxy

Cấu hình chứng chỉ HTTPS, phiên bản TLS, proxy và phân giải DNS tùy chỉnh trong curl là thiết yếu cho giao tiếp API an toàn, pipeline CI/CD và gỡ lỗi sự cố mạng. Hướng dẫn này bao gồm mọi flag SSL, TLS, proxy và mạng — từ vô hiệu hóa kiểm tra chứng chỉ với -k cho phát triển cục bộ đến thiết lập mutual TLS với --cert và định tuyến lưu lượng qua proxy SOCKS5. Mỗi tùy chọn bao gồm giải thích rõ ràng, cân nhắc bảo mật và ví dụ sẵn sàng để sao chép.

Bảng tham chiếu nhanh flag SSL & Proxy

-kSSL/TLS

Cho phép kết nối không an toàn — bỏ qua tất cả xác minh SSL

--cacertSSL/TLS

Xác minh chứng chỉ server so với gói CA cụ thể

--certSSL/TLS

Cung cấp chứng chỉ client cho xác thực mutual TLS

--keySSL/TLS

Cung cấp file khóa riêng cho chứng chỉ client

--tlsv1.2SSL/TLS

Sử dụng TLS phiên bản 1.2 hoặc cao hơn cho kết nối

--tlsv1.3SSL/TLS

Sử dụng TLS phiên bản 1.3 hoặc cao hơn cho kết nối

--ssl-reqdSSL/TLS

Yêu cầu SSL/TLS cho kết nối (thất bại nếu không có)

--ciphersSSL/TLS

Chỉ định cipher SSL nào sử dụng cho kết nối

--cert-typeSSL/TLS

Chỉ định loại chứng chỉ client (PEM, DER, ENG, P12)

--pinnedpubkeySSL/TLS

Ghim và xác minh khóa công khai server (kiểu HPKP)

-xProxy

Định tuyến tất cả lưu lượng qua proxy server chỉ định

Định tuyến kết nối qua proxy SOCKS5

Cung cấp username:password cho proxy server

Danh sách host không nên đi qua proxy

--socks5-hostnameProxy

Proxy SOCKS5 với phân giải DNS qua proxy

--proxy-cacertProxy

Chứng chỉ CA để xác minh proxy HTTPS

--resolveMạng

Ánh xạ cặp host:port cụ thể đến địa chỉ IP tùy chỉnh

Kết nối đến host:port khác với URL chỉ định

--local-portMạng

Đặt số port cục bộ hoặc phạm vi cho kết nối

--interfaceMạng

Gắn kết nối vào giao diện mạng cụ thể

--dns-serversMạng

Sử dụng DNS server tùy chỉnh thay vì mặc định hệ thống (c-ares)

curl -k: Bỏ qua lỗi chứng chỉ SSL

Chức năng
Flag -k (hoặc --insecure) vô hiệu hóa tất cả xác minh chứng chỉ SSL/TLS. curl sẽ không kiểm tra xem chứng chỉ server có được ký bởi CA đáng tin cậy hay không, hostname có khớp không, hoặc chứng chỉ đã hết hạn chưa.
Khi nào sử dụng
Sử dụng chỉ cho phát triển cục bộ với chứng chỉ tự ký hoặc môi trường thử nghiệm. Cho staging/production, sử dụng --cacert với chứng chỉ CA thực tế — an toàn hơn và rõ ràng hơn.
$ curl -k https://localhost:8443/api/health

Không bao giờ sử dụng -k trong script production hoặc pipeline CI/CD. Nó vô hiệu hóa tất cả xác minh chứng chỉ, khiến kết nối của bạn dễ bị tấn công man-in-the-middle. Sử dụng --cacert để tin cậy CA cụ thể thay thế.

curl --cacert: Sử dụng chứng chỉ CA tùy chỉnh

Chức năng
Flag --cacert yêu cầu curl xác minh chứng chỉ SSL của server so với file gói CA (Certificate Authority) cụ thể ở định dạng PEM, thay vì kho tin cậy mặc định của hệ thống.
Khi nào sử dụng
Sử dụng khi server của bạn dùng chứng chỉ được ký bởi CA riêng hoặc nội bộ không có trong kho tin cậy hệ thống. Đây là trường hợp phổ biến trong môi trường doanh nghiệp, Kubernetes cluster và Docker setup với PKI nội bộ.
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert: Chứng chỉ client (Mutual TLS)

Chức năng
Flag --cert cung cấp chứng chỉ phía client cho mutual TLS (mTLS). Trong mTLS, cả server và client đều trình bày chứng chỉ để xác minh danh tính của nhau. File chứng chỉ nên ở định dạng PEM hoặc PKCS#12.
Khi nào sử dụng
Bắt buộc khi server yêu cầu xác thực chứng chỉ client — phổ biến trong API ngân hàng, dịch vụ chính phủ, giao tiếp thiết bị IoT và kiến trúc zero-trust. Luôn kết hợp với --key trừ khi key được nhúng trong file cert.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key: Khóa riêng chứng chỉ client

Chức năng
Flag --key chỉ định file khóa riêng ghép nối với chứng chỉ client được cung cấp bởi --cert. Khóa phải khớp với chứng chỉ. Nếu khóa được bảo vệ bằng mật khẩu, curl sẽ yêu cầu passphrase (hoặc sử dụng --pass).
Khi nào sử dụng
Luôn sử dụng cùng với --cert. Nếu khóa riêng đã được nhúng trong file chứng chỉ (phổ biến với file PKCS#12 / .p12), bạn có thể bỏ qua --key.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2: Bắt buộc TLS 1.2 tối thiểu

Chức năng
Flag --tlsv1.2 buộc curl sử dụng TLS 1.2 làm phiên bản tối thiểu chấp nhận được cho bắt tay SSL/TLS. Các giao thức cũ hơn (TLS 1.0, 1.1, SSLv3) bị từ chối.
Khi nào sử dụng
Sử dụng để đảm bảo tiêu chuẩn bảo mật tối thiểu. TLS 1.2 được yêu cầu cho tuân thủ PCI-DSS và được hỗ trợ bởi tất cả server hiện đại. Hầu hết bản build curl hiện đại đã mặc định TLS 1.2+, nhưng flag này làm rõ ràng hơn.
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3: Bắt buộc TLS 1.3 tối thiểu

Chức năng
Flag --tlsv1.3 buộc curl sử dụng TLS 1.3 — phiên bản TLS nhanh nhất và an toàn nhất. TLS 1.3 loại bỏ round-trip thừa trong bắt tay (hỗ trợ 0-RTT) và xóa tất cả cipher suite lỗi thời.
Khi nào sử dụng
Sử dụng khi bạn biết server hỗ trợ TLS 1.3 và bạn muốn hiệu suất và bảo mật tốt nhất. Lưu ý: TLS 1.3 yêu cầu OpenSSL 1.1.1+ hoặc thư viện TLS tương thích. Chưa phải tất cả server đều hỗ trợ.
$ curl --tlsv1.3 https://modern-api.example.com/data

Các tùy chọn SSL/TLS bổ sung

--ssl-reqd

Yêu cầu SSL/TLS cho kết nối (thất bại nếu không có)

--ciphers

Chỉ định cipher SSL nào sử dụng cho kết nối

--cert-type

Chỉ định loại chứng chỉ client (PEM, DER, ENG, P12)

--pinnedpubkey

Ghim và xác minh khóa công khai server (kiểu HPKP)

curl -x: Sử dụng proxy HTTP/HTTPS

Chức năng
Flag -x (hoặc --proxy) định tuyến tất cả lưu lượng curl qua proxy server chỉ định. Định dạng là [protocol://]host[:port]. Các giao thức proxy được hỗ trợ: HTTP, HTTPS, SOCKS4, SOCKS5.
Khi nào sử dụng
Sử dụng cho proxy server doanh nghiệp, gỡ lỗi với các công cụ như Fiddler, Charles hoặc mitmproxy, kiểm tra hạn chế địa lý, hoặc khi không có truy cập internet trực tiếp. Bạn cũng có thể đặt biến môi trường http_proxy / https_proxy thay thế.
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5: Sử dụng proxy SOCKS5

Chức năng
Flag --socks5 yêu cầu curl sử dụng proxy SOCKS5 cho kết nối TCP. Khác với proxy HTTP, SOCKS5 hoạt động ở tầng TCP và có thể xử lý bất kỳ giao thức nào — không chỉ HTTP. Phân giải DNS được thực hiện cục bộ theo mặc định; sử dụng --socks5-hostname để phân giải DNS qua proxy.
Khi nào sử dụng
Sử dụng cho tunnel SSH (ssh -D), truy cập mạng Tor, hoặc khi proxy phải xử lý giao thức không phải HTTP. SOCKS5 hỗ trợ UDP và có thể tùy chọn xử lý DNS — làm nó linh hoạt hơn proxy HTTP.
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user: Xác thực proxy

Chức năng
Flag --proxy-user (hoặc -U) gửi thông tin xác thực đến proxy server. Định dạng là user:password. Đây là riêng biệt với xác thực server (-u).
Khi nào sử dụng
Bắt buộc khi proxy server yêu cầu xác thực — phổ biến trong môi trường mạng doanh nghiệp. Thông tin xác thực được gửi đến proxy, không phải server đích.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy: Bỏ qua proxy cho host cụ thể

Chức năng
Flag --noproxy chỉ định danh sách phân cách bằng dấu phẩy các host, domain hoặc địa chỉ IP nên bỏ qua proxy và kết nối trực tiếp. Hỗ trợ wildcard: *.example.com khớp tất cả subdomain.
Khi nào sử dụng
Sử dụng để loại trừ localhost, dịch vụ nội bộ hoặc domain cụ thể khỏi proxy. Đây là điều quan trọng khi proxy được đặt toàn cục qua biến môi trường nhưng một số host (như dịch vụ cục bộ) cần truy cập trực tiếp. Sử dụng * để bỏ qua proxy cho tất cả host.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

Các tùy chọn Proxy bổ sung

--socks5-hostname

Proxy SOCKS5 với phân giải DNS qua proxy

--proxy-cacert

Chứng chỉ CA để xác minh proxy HTTPS

curl --resolve: Phân giải DNS tùy chỉnh

Chức năng
Flag --resolve cung cấp địa chỉ IP tùy chỉnh cho cặp host:port cụ thể, hoàn toàn bỏ qua tra cứu DNS. Định dạng là host:port:address. Có thể cung cấp nhiều entry --resolve.
Khi nào sử dụng
Thiết yếu cho kiểm tra trước khi DNS lan truyền, xác minh backend cụ thể đằng sau load balancer, hoặc phát triển cục bộ nơi bạn cần hostname thật cho xác minh chứng chỉ SSL. Khác với chỉnh sửa /etc/hosts, đây là theo từng request và cụ thể theo port.
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to: Chuyển hướng kết nối đến host khác

Chức năng
Flag --connect-to chuyển hướng kết nối TCP đến cặp host:port khác trong khi giữ URL gốc cho HTTP request (bao gồm header Host và SNI). Định dạng: HOST1:PORT1:HOST2:PORT2.
Khi nào sử dụng
Sử dụng để kiểm tra backend server cụ thể đằng sau load balancer mà không cần sửa DNS hoặc /etc/hosts. Khác với --resolve, đây ánh xạ host:port sang host:port (không phải IP), hữu ích khi đích cũng có hostname.
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

Các tùy chọn Mạng bổ sung

--local-port

Đặt số port cục bộ hoặc phạm vi cho kết nối

--interface

Gắn kết nối vào giao diện mạng cụ thể

--dns-servers

Sử dụng DNS server tùy chỉnh thay vì mặc định hệ thống (c-ares)

Các tình huống SSL & Proxy thực tế

Các ví dụ này kết hợp nhiều flag để xử lý các tác vụ bảo mật và mạng phổ biến trong phát triển, CI/CD và môi trường production.

Kiểm tra HTTPS trên Localhost

Khi phát triển cục bộ với chứng chỉ tự ký, kết hợp --resolve với --cacert (hoặc -k cho kiểm tra nhanh). Điều này cho phép bạn sử dụng hostname thật cho SSL/SNI đúng cách mà không cần sửa file hosts.

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

Mutual TLS (Xác thực chứng chỉ client)

Một số API yêu cầu cả server và client đều trình bày chứng chỉ. Cung cấp --cert, --key--cacert để thiết lập kết nối TLS hai chiều được xác minh đầy đủ.

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

Proxy doanh nghiệp với xác thực

Trong mạng doanh nghiệp có proxy server bắt buộc, kết hợp -x với -U cho thông tin xác thực proxy. Thêm --noproxy để loại trừ dịch vụ nội bộ khỏi proxy.

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

Docker Container với CA nội bộ

Khi dịch vụ trong Docker sử dụng chứng chỉ từ CA nội bộ, mount chứng chỉ CA vào container và tham chiếu với --cacert. Đây an toàn hơn -k vì nó vẫn xác minh chuỗi chứng chỉ.

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

Proxy SOCKS5 qua SSH Tunnel

Tạo proxy SOCKS5 với ssh -D và định tuyến lưu lượng curl qua nó bằng --socks5. Đây hữu ích cho việc truy cập dịch vụ nội bộ thông qua bastion host.

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

Câu hỏi thường gặp về curl SSL & Proxy

Làm thế nào để bỏ qua xác minh chứng chỉ SSL trong curl?

Sử dụng curl -k URL hoặc curl --insecure URL. Điều này vô hiệu hóa tất cả kiểm tra chứng chỉ — hết hạn, hostname không khớp, CA không đáng tin cậy. Sử dụng chỉ cho phát triển cục bộ. Cho production, sử dụng --cacert với chứng chỉ CA thực tế.

Làm thế nào để curl tin cậy chứng chỉ tự ký?

Sử dụng curl --cacert /path/to/ca.pem URL để chỉ định chứng chỉ CA đã ký chứng chỉ tự ký của bạn. Đây an toàn hơn -k vì nó vẫn xác minh chuỗi chứng chỉ — chỉ tin cậy CA cụ thể của bạn.

Làm thế nào để kiểm tra curl đang sử dụng phiên bản TLS nào?

Chạy curl -v URL và tìm dòng * SSL connection using TLSv1.x / CipherSuite trong đầu ra verbose. Để buộc phiên bản cụ thể, sử dụng --tlsv1.2 hoặc --tlsv1.3.

Mutual TLS (mTLS) là gì và cách sử dụng với curl?

Mutual TLS yêu cầu cả server và client đều trình bày chứng chỉ. Sử dụng: curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL. Cặp --cert/--key xác thực client; --cacert xác minh server.

Làm thế nào để sử dụng curl qua proxy HTTP?

Sử dụng curl -x http://proxy:port URL. Cho proxy HTTPS: curl -x https://proxy:port URL. Ngoài ra, đặt biến môi trường http_proxyhttps_proxy — curl tự động nhận chúng.

Làm thế nào để sử dụng curl với proxy SOCKS5?

Sử dụng curl --socks5 host:port URL cho phân giải DNS cục bộ, hoặc curl --socks5-hostname host:port URL để phân giải DNS qua proxy (quan trọng cho quyền riêng tư/Tor). Ví dụ với SSH tunnel: ssh -D 1080 user@bastion, sau đó curl --socks5 localhost:1080 URL.

Làm thế nào để xác thực với proxy server trong curl?

Sử dụng curl -x http://proxy:port -U user:password URL. Flag -U (hoặc --proxy-user) gửi thông tin xác thực đến proxy. Đây là riêng biệt với -u, xác thực với server đích.

Làm thế nào để loại trừ host nhất định khỏi proxy trong curl?

Sử dụng --noproxy "localhost,127.0.0.1,*.internal.com" hoặc đặt biến môi trường NO_PROXY. Hỗ trợ wildcard (*.example.com). Sử dụng --noproxy "*" để bỏ qua proxy hoàn toàn cho một request.

Làm thế nào để kiểm tra HTTPS trên localhost với curl?

Cho kiểm tra nhanh: curl -k https://localhost:8443/. Cho xác minh đúng cách: curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/. Cách tiếp cận --resolve cho phép hostname chứng chỉ khớp đúng.

Làm thế nào để ghi đè phân giải DNS cho host cụ thể trong curl?

Sử dụng curl --resolve host:port:IP URL. Ví dụ: curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/. Đây bỏ qua DNS cho cặp host:port đó — không cần chỉnh sửa /etc/hosts.

Làm thế nào để sửa lỗi 'SSL certificate problem: certificate has expired' trong curl?

Chứng chỉ server đã hết hạn. Giải pháp: (1) Gia hạn chứng chỉ trên server, (2) Cập nhật gói CA: curl --cacert /path/to/updated-ca.pem URL, (3) Chỉ cho kiểm tra: curl -k URL. Kiểm tra hạn: curl -v URL 2>&1 | grep expire.

Sử dụng curl --insecure (-k) trong production có an toàn không?

Không. Flag -k vô hiệu hóa tất cả xác minh chứng chỉ — hết hạn, hostname và chuỗi tin cậy. Điều này khiến kết nối của bạn dễ bị tấn công man-in-the-middle. Luôn sử dụng --cacert với chứng chỉ CA cụ thể trong production và pipeline CI/CD.