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
Cho phép kết nối không an toàn — bỏ qua tất cả xác minh SSL
Xác minh chứng chỉ server so với gói CA cụ thể
Cung cấp chứng chỉ client cho xác thực mutual TLS
Cung cấp file khóa riêng cho chứng chỉ client
Sử dụng TLS phiên bản 1.2 hoặc cao hơn cho kết nối
Sử dụng TLS phiên bản 1.3 hoặc cao hơn cho kết nối
Yêu cầu SSL/TLS cho kết nối (thất bại nếu không có)
Chỉ định cipher SSL nào sử dụng cho kết nối
Chỉ định loại chứng chỉ client (PEM, DER, ENG, P12)
Ghim và xác minh khóa công khai server (kiểu HPKP)
Đị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
Proxy SOCKS5 với phân giải DNS qua proxy
Chứng chỉ CA để xác minh proxy HTTPS
Á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
Đặt số port cục bộ hoặc phạm vi cho kết nối
Gắn kết nối vào giao diện mạng cụ thể
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
--cacertvớ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/healthKhô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
--cacertyê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/datacurl --cert: Chứng chỉ client (Mutual TLS)
- Chức năng
- Flag
--certcung 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
--keytrừ khi key được nhúng trong file cert.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/securecurl --key: Khóa riêng chứng chỉ client
- Chức năng
- Flag
--keychỉ đị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/securecurl --tlsv1.2: Bắt buộc TLS 1.2 tối thiểu
- Chức năng
- Flag
--tlsv1.2buộ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.3buộ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/dataCác tùy chọn SSL/TLS bổ sung
Yêu cầu SSL/TLS cho kết nối (thất bại nếu không có)
Chỉ định cipher SSL nào sử dụng cho kết nối
Chỉ định loại chứng chỉ client (PEM, DER, ENG, P12)
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_proxythay thế.
$ curl -x http://proxy.example.com:8080 https://api.example.com/datacurl --socks5: Sử dụng proxy SOCKS5
- Chức năng
- Flag
--socks5yê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/datacurl --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/datacurl --noproxy: Bỏ qua proxy cho host cụ thể
- Chức năng
- Flag
--noproxychỉ đị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.comkhớ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/apiCác tùy chọn Proxy bổ sung
Proxy SOCKS5 với phân giải DNS qua proxy
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
--resolvecung cấp địa chỉ IP tùy chỉnh cho cặphost:portcụ 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/healthcurl --connect-to: Chuyển hướng kết nối đến host khác
- Chức năng
- Flag
--connect-tochuyển hướng kết nối TCP đến cặphost:portkhác trong khi giữ URL gốc cho HTTP request (bao gồm headerHostvà 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/healthCác tùy chọn Mạng bổ sung
Đặt số port cục bộ hoặc phạm vi cho kết nối
Gắn kết nối vào giao diện mạng cụ thể
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/statusMutual 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 và --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/dataProxy 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/dataDocker 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/healthProxy 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/statusCâ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_proxy và https_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.