Průvodce konfigurací SSL, TLS a proxy v curl

Konfigurace HTTPS certifikátů, verzí TLS, proxy serverů a vlastního DNS rozlišení v curl je zásadní pro bezpečnou API komunikaci, CI/CD pipelines a ladění síťových problémů. Tento průvodce pokrývá každý přepínač SSL, TLS, proxy a sítě — od deaktivace kontroly certifikátů pomocí -k pro lokální vývoj po nastavení vzájemného TLS pomocí --cert a směrování provozu přes SOCKS5 proxy. Každá možnost obsahuje jasné vysvětlení, bezpečnostní aspekty a příklad připravený ke kopírování.

Rychlý přehled přepínačů SSL a proxy

-kSSL/TLS

Povolení nezabezpečených spojení — přeskočení veškerého ověření SSL

--cacertSSL/TLS

Ověření certifikátu serveru vůči konkrétnímu CA balíku

--certSSL/TLS

Poskytnutí klientského certifikátu pro mutual TLS ověření

--keySSL/TLS

Poskytnutí souboru soukromého klíče pro klientský certifikát

--tlsv1.2SSL/TLS

Použití TLS verze 1.2 nebo vyšší pro spojení

--tlsv1.3SSL/TLS

Použití TLS verze 1.3 nebo vyšší pro spojení

--ssl-reqdSSL/TLS

Vyžadování SSL/TLS pro spojení (selhání pokud není k dispozici)

--ciphersSSL/TLS

Určení SSL šifer pro spojení

--cert-typeSSL/TLS

Určení typu klientského certifikátu (PEM, DER, ENG, P12)

--pinnedpubkeySSL/TLS

Připnutí a ověření veřejného klíče serveru (styl HPKP)

-xProxy

Směrování veškerého provozu přes zadaný proxy server

Směrování spojení přes SOCKS5 proxy

Poskytnutí uživatelského jména:hesla pro proxy server

Seznam hostitelů, kteří by neměli procházet přes proxy

--socks5-hostnameProxy

SOCKS5 proxy s DNS rozlišením přes proxy

--proxy-cacertProxy

CA certifikát pro ověření samotného HTTPS proxy

Mapování konkrétního páru host:port na vlastní IP adresu

Připojení k jinému host:port než určuje URL

--local-portSíť

Nastavení čísla lokálního portu nebo rozsahu pro spojení

--interfaceSíť

Navázání spojení na konkrétní síťové rozhraní

--dns-serversSíť

Použití vlastních DNS serverů místo systémových výchozích (c-ares)

curl -k: Ignorování chyb SSL certifikátu

Co dělá
Přepínač -k (nebo --insecure) deaktivuje veškeré ověření SSL/TLS certifikátů. curl nebude kontrolovat, zda je certifikát serveru podepsaný důvěryhodnou CA, zda se shoduje název hostitele nebo zda certifikát nevypršel.
Kdy použít
Používejte pouze pro lokální vývoj se self-signed certifikáty nebo testovací prostředí. Pro staging/produkci použijte místo toho --cacert se skutečným CA certifikátem — je to bezpečnější a explicitnější.
$ curl -k https://localhost:8443/api/health

Nikdy nepoužívejte -k v produkčních skriptech nebo CI/CD pipelines. Deaktivuje veškerou validaci certifikátů, čímž je vaše spojení zranitelné vůči útokům typu man-in-the-middle. Použijte --cacert pro důvěru konkrétní CA.

curl --cacert: Použití vlastního CA certifikátu

Co dělá
Přepínač --cacert říká curl, aby ověřil SSL certifikát serveru vůči konkrétnímu souboru CA (Certificate Authority) balíku ve formátu PEM, místo výchozího úložiště důvěry systému.
Kdy použít
Použijte, když váš server používá certifikát podepsaný soukromou nebo interní CA, která není v systémovém úložišti důvěry. To je běžné v korporátních prostředích, Kubernetes clusterech a Docker prostředích s interní PKI.
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert: Klientský certifikát (Mutual TLS)

Co dělá
Přepínač --cert poskytuje certifikát na straně klienta pro mutual TLS (mTLS). Při mTLS oba — server i klient — předloží certifikáty k ověření identity. Soubor certifikátu by měl být ve formátu PEM nebo PKCS#12.
Kdy použít
Vyžadováno, když server vyžaduje ověření klientským certifikátem — běžné u bankovních API, vládních služeb, IoT komunikace a architektur s nulovým důvěryhodností. Vždy párujte s --key, pokud klíč není vložen v cert souboru.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key: Soukromý klíč klientského certifikátu

Co dělá
Přepínač --key určuje soubor soukromého klíče, který se páruje s klientským certifikátem poskytnutým přes --cert. Klíč musí odpovídat certifikátu. Pokud je klíč chráněn heslem, curl si vyžádá heslo (nebo použijte --pass).
Kdy použít
Vždy používejte společně s --cert. Pokud je soukromý klíč již vložen v souboru certifikátu (běžné u PKCS#12 / .p12 souborů), můžete --key vynechat.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2: Vynucení minimálně TLS 1.2

Co dělá
Přepínač --tlsv1.2 nutí curl používat TLS 1.2 jako minimální přijatelnou verzi pro SSL/TLS handshake. Starší protokoly (TLS 1.0, 1.1, SSLv3) jsou odmítnuty.
Kdy použít
Použijte pro vynucení minimálního bezpečnostního standardu. TLS 1.2 je vyžadován pro shodu s PCI-DSS a je podporován všemi moderními servery. Většina moderních buildů curl již používá TLS 1.2+ ve výchozím nastavení, ale tento přepínač to činí explicitním.
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3: Vynucení minimálně TLS 1.3

Co dělá
Přepínač --tlsv1.3 nutí curl používat TLS 1.3 — nejrychlejší a nejbezpečnější verzi TLS. TLS 1.3 eliminuje extra round-trip v handshake (podpora 0-RTT) a odstraňuje všechny zastaralé cipher suites.
Kdy použít
Použijte, když víte, že server podporuje TLS 1.3 a chcete nejlepší výkon a bezpečnost. Poznámka: TLS 1.3 vyžaduje OpenSSL 1.1.1+ nebo kompatibilní TLS knihovnu. Ne všechny servery ho zatím podporují.
$ curl --tlsv1.3 https://modern-api.example.com/data

Další SSL/TLS možnosti

--ssl-reqd

Vyžadování SSL/TLS pro spojení (selhání pokud není k dispozici)

--ciphers

Určení SSL šifer pro spojení

--cert-type

Určení typu klientského certifikátu (PEM, DER, ENG, P12)

--pinnedpubkey

Připnutí a ověření veřejného klíče serveru (styl HPKP)

curl -x: Použití HTTP/HTTPS proxy

Co dělá
Přepínač -x (nebo --proxy) směruje veškerý provoz curl přes zadaný proxy server. Formát je [protocol://]host[:port]. Podporované proxy protokoly: HTTP, HTTPS, SOCKS4, SOCKS5.
Kdy použít
Použijte pro korporátní proxy servery, ladění s nástroji jako Fiddler, Charles nebo mitmproxy, testování geografických omezení nebo když není k dispozici přímý přístup k internetu. Můžete také nastavit proměnné prostředí http_proxy / https_proxy.
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5: Použití SOCKS5 proxy

Co dělá
Přepínač --socks5 říká curl, aby pro TCP spojení použil SOCKS5 proxy. Na rozdíl od HTTP proxy SOCKS5 operuje na úrovni TCP a může zpracovat jakýkoli protokol — nejen HTTP. DNS rozlišení se provádí lokálně ve výchozím nastavení; použijte --socks5-hostname pro rozlišení DNS přes proxy.
Kdy použít
Použijte pro SSH tunely (ssh -D), přístup k síti Tor nebo když proxy musí zpracovat protokoly jiné než HTTP. SOCKS5 podporuje UDP a volitelně může zpracovat DNS — díky čemuž je flexibilnější než HTTP proxy.
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user: Ověření proxy

Co dělá
Přepínač --proxy-user (nebo -U) odesílá přihlašovací údaje proxy serveru. Formát je user:password. To je oddělené od ověření serveru (-u).
Kdy použít
Vyžadováno, když proxy server vyžaduje ověření — běžné v korporátních a podnikových síťových prostředích. Přihlašovací údaje se odesílají proxy, nikoli cílovému serveru.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy: Obejití proxy pro konkrétní hostitele

Co dělá
Přepínač --noproxy určuje čárkou oddělený seznam hostitelů, domén nebo IP adres, které by měly obejít proxy a připojit se přímo. Podporuje zástupné znaky: *.example.com odpovídá všem subdoménám.
Kdy použít
Použijte pro vyloučení localhost, interních služeb nebo konkrétních domén z proxy. To je důležité, když je proxy nastaveno globálně přes proměnné prostředí, ale některí hostitelé (jako lokální služby) potřebují přímý přístup. Pro obejití proxy pro všechny hostitele použijte *.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

Další proxy možnosti

--socks5-hostname

SOCKS5 proxy s DNS rozlišením přes proxy

--proxy-cacert

CA certifikát pro ověření samotného HTTPS proxy

curl --resolve: Vlastní DNS rozlišení

Co dělá
Přepínač --resolve poskytuje vlastní IP adresu pro konkrétní pár host:port, zcela obcházejíce DNS vyhledávání. Formát je host:port:address. Lze zadat více --resolve záznamů.
Kdy použít
Zásadní pro testování před propagací DNS, ověření konkrétního backendu za load balancerem nebo lokální vývoj, kde potřebujete skutečný hostname pro validaci SSL certifikátu. Na rozdíl od úpravy /etc/hosts je to per-request a specifické pro port.
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to: Přesměrování spojení na jiného hostitele

Co dělá
Přepínač --connect-to přesměruje TCP spojení na jiný pár host:port, přičemž zachovává původní URL pro HTTP požadavek (včetně hlavičky Host a SNI). Formát: HOST1:PORT1:HOST2:PORT2.
Kdy použít
Použijte pro testování konkrétního backendového serveru za load balancerem bez modifikace DNS nebo /etc/hosts. Na rozdíl od --resolve mapuje host:port na host:port (ne na IP), což je užitečné, když cíl má také hostname.
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

Další síťové možnosti

--local-port

Nastavení čísla lokálního portu nebo rozsahu pro spojení

--interface

Navázání spojení na konkrétní síťové rozhraní

--dns-servers

Použití vlastních DNS serverů místo systémových výchozích (c-ares)

Reálné scénáře SSL a proxy

Tyto příklady kombinují více přepínačů pro řešení běžných bezpečnostních a síťových úloh při vývoji, CI/CD a v produkčních prostředích.

Testování HTTPS na Localhost

Při lokálním vývoji se self-signed certifikátem kombinujte --resolve s --cacert (nebo -k pro rychlé testování). To vám umožní použít skutečný hostname pro správné SSL/SNI bez modifikace souboru hosts.

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

Mutual TLS (ověření klientským certifikátem)

Některá API vyžadují, aby server i klient předložili certifikáty. Poskytněte --cert, --key a --cacert pro vytvoření plně ověřeného oboustranného TLS spojení.

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

Korporátní proxy s ověřením

V korporátních sítích s povinnými proxy servery kombinujte -x s -U pro přihlašovací údaje proxy. Přidejte --noproxy pro vyloučení interních služeb z proxy.

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

Docker kontejner s interní CA

Když služby v Dockeru používají certifikáty od interní CA, připojte CA certifikát do kontejneru a odkažte na něj pomocí --cacert. To je bezpečnější než -k, protože stále validuje řetěz certifikátů.

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

SOCKS5 proxy přes SSH tunel

Vytvořte SOCKS5 proxy pomocí ssh -D a směrujte provoz curl přes něj pomocí --socks5. To je užitečné pro přístup k interním službám přes bastion host.

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

Často kladené otázky o curl SSL a proxy

Jak přeskočím ověření SSL certifikátu v curl?

Použijte curl -k URL nebo curl --insecure URL. To deaktivuje veškeré kontroly certifikátů — vypršení, nesoulad hostname, nedůvěryhodná CA. Používejte pouze pro lokální vývoj. Pro produkci použijte --cacert se skutečným CA certifikátem.

Jak zajistím, aby curl důvěřoval self-signed certifikátu?

Použijte curl --cacert /path/to/ca.pem URL pro zadání CA certifikátu, který podepsal váš self-signed certifikát. To je bezpečnější než -k, protože stále validuje řetěz certifikátů — důvěřuje pouze vaší konkrétní CA.

Jak zjistím, jakou verzi TLS curl používá?

Spusťte curl -v URL a hledejte řádek * SSL connection using TLSv1.x / CipherSuite v podrobném výstupu. Pro vynucení konkrétní verze použijte --tlsv1.2 nebo --tlsv1.3.

Co je mutual TLS (mTLS) a jak ho použiji s curl?

Mutual TLS vyžaduje, aby oba — server i klient — předložili certifikáty. Použijte: curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL. Pár --cert/--key ověřuje klienta; --cacert ověřuje server.

Jak použiji curl přes HTTP proxy?

Použijte curl -x http://proxy:port URL. Pro HTTPS proxy: curl -x https://proxy:port URL. Alternativně nastavte proměnné prostředí http_proxy a https_proxy — curl je automaticky detekuje.

Jak použiji curl se SOCKS5 proxy?

Použijte curl --socks5 host:port URL pro lokální DNS rozlišení nebo curl --socks5-hostname host:port URL pro rozlišení DNS přes proxy (důležité pro soukromí/Tor). Příklad s SSH tunelem: ssh -D 1080 user@bastion, pak curl --socks5 localhost:1080 URL.

Jak se ověřím na proxy serveru v curl?

Použijte curl -x http://proxy:port -U user:password URL. Přepínač -U (nebo --proxy-user) odesílá přihlašovací údaje na proxy. To je oddělené od -u, které ověřuje cílový server.

Jak vyloučím určité hostitele z proxy v curl?

Použijte --noproxy "localhost,127.0.0.1,*.internal.com" nebo nastavte proměnnou prostředí NO_PROXY. Podporuje zástupné znaky (*.example.com). Pro kompletní obejití proxy pro jeden požadavek použijte --noproxy "*".

Jak otestuji HTTPS na localhost pomocí curl?

Pro rychlé testování: curl -k https://localhost:8443/. Pro správnou validaci: curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/. Přístup s --resolve umožňuje správnou shodu hostname certifikátu.

Jak přepíšu DNS rozlišení pro konkrétního hostitele v curl?

Použijte curl --resolve host:port:IP URL. Příklad: curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/. To obejde DNS pouze pro daný pár host:port — není nutné editovat /etc/hosts.

Jak opravím chybu 'SSL certificate problem: certificate has expired' v curl?

Certifikát serveru vypršel. Řešení: (1) Obnovte certifikát na serveru, (2) Aktualizujte CA balík: curl --cacert /path/to/updated-ca.pem URL, (3) Pouze pro testování: curl -k URL. Kontrola vypršení: curl -v URL 2>&1 | grep expire.

Je bezpečné používat curl --insecure (-k) v produkci?

Ne. Přepínač -k deaktivuje veškerou validaci certifikátů — vypršení, hostname a řetěz důvěry. To činí vaše spojení zranitelným vůči útokům typu man-in-the-middle. V produkci a CI/CD pipelines vždy používejte --cacert s konkrétním CA certifikátem.