Guida alla configurazione curl SSL, TLS e Proxy

Configurare certificati HTTPS, versioni TLS, proxy e risoluzione DNS personalizzata in curl è essenziale per la comunicazione API sicura, le pipeline CI/CD e il debug dei problemi di rete. Questa guida copre ogni flag SSL, TLS, proxy e di rete — dalla disabilitazione dei controlli certificato con -k per lo sviluppo locale alla configurazione del mutual TLS con --cert e all'instradamento del traffico attraverso proxy SOCKS5. Ogni opzione include una spiegazione chiara, considerazioni sulla sicurezza e un esempio pronto da copiare.

Riferimento rapido flag SSL e Proxy

-kSSL/TLS

Consenti connessioni non sicure — salta tutta la verifica SSL

--cacertSSL/TLS

Verifica il certificato del server contro un bundle CA specifico

--certSSL/TLS

Fornisci un certificato client per l'autenticazione mutual TLS

--keySSL/TLS

Fornisci il file della chiave privata per il certificato client

--tlsv1.2SSL/TLS

Usa TLS versione 1.2 o superiore per la connessione

--tlsv1.3SSL/TLS

Usa TLS versione 1.3 o superiore per la connessione

--ssl-reqdSSL/TLS

Richiedi SSL/TLS per la connessione (fallisci se non disponibile)

--ciphersSSL/TLS

Specifica quali cipher SSL usare per la connessione

--cert-typeSSL/TLS

Specifica il tipo di certificato client (PEM, DER, ENG, P12)

--pinnedpubkeySSL/TLS

Fissa e verifica la chiave pubblica del server (stile HPKP)

-xProxy

Instrada tutto il traffico attraverso il server proxy specificato

Instrada la connessione attraverso un proxy SOCKS5

Fornisci username:password per il server proxy

Lista di host che non dovrebbero passare attraverso il proxy

--socks5-hostnameProxy

Proxy SOCKS5 con risoluzione DNS attraverso il proxy

--proxy-cacertProxy

Certificato CA per verificare il proxy HTTPS stesso

Mappa una specifica coppia host:port a un indirizzo IP personalizzato

Connettiti a un host:port diverso da quello specificato nell'URL

--local-portRete

Imposta il numero di porta locale o l'intervallo per la connessione

--interfaceRete

Vincola la connessione a un'interfaccia di rete specifica

--dns-serversRete

Usa server DNS personalizzati invece dei predefiniti di sistema (c-ares)

curl -k: Ignora gli errori del certificato SSL

Cosa fa
Il flag -k (o --insecure) disabilita tutta la verifica dei certificati SSL/TLS. curl non controllerà se il certificato del server è firmato da una CA affidabile, se il nome host corrisponde o se il certificato è scaduto.
Quando usarlo
Usa solo per lo sviluppo locale con certificati autofirmati o ambienti di test. Per staging/production, usa --cacert con il certificato CA effettivo — è più sicuro e più esplicito.
$ curl -k https://localhost:8443/api/health

Non usare mai -k in script di production o pipeline CI/CD. Disabilita tutta la validazione dei certificati, rendendo la connessione vulnerabile ad attacchi man-in-the-middle. Usa --cacert per fidarti di una CA specifica.

curl --cacert: Usa un certificato CA personalizzato

Cosa fa
Il flag --cacert indica a curl di verificare il certificato SSL del server contro un file bundle CA (Certificate Authority) specifico in formato PEM, invece del trust store predefinito del sistema.
Quando usarlo
Usa quando il tuo server utilizza un certificato firmato da una CA privata o interna che non è nel trust store di sistema. Questo è comune in ambienti aziendali, cluster Kubernetes e configurazioni Docker con PKI interna.
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert: Certificato client (Mutual TLS)

Cosa fa
Il flag --cert fornisce un certificato lato client per il mutual TLS (mTLS). Nel mTLS, sia il server che il client presentano certificati per verificare l'identità reciproca. Il file certificato deve essere in formato PEM o PKCS#12.
Quando usarlo
Necessario quando il server richiede l'autenticazione con certificato client — comune nelle API bancarie, servizi governativi, comunicazione dispositivi IoT e architetture zero-trust. Accoppia sempre con --key a meno che la chiave non sia incorporata nel file certificato.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key: Chiave privata del certificato client

Cosa fa
Il flag --key specifica il file della chiave privata che si accoppia con il certificato client fornito da --cert. La chiave deve corrispondere al certificato. Se la chiave è protetta da password, curl richiederà la passphrase (o usa --pass).
Quando usarlo
Usa sempre insieme a --cert. Se la chiave privata è già incorporata nel file certificato (comune con file PKCS#12 / .p12), puoi omettere --key.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2: Forza TLS 1.2 minimo

Cosa fa
Il flag --tlsv1.2 forza curl a usare TLS 1.2 come versione minima accettabile per l'handshake SSL/TLS. I protocolli più vecchi (TLS 1.0, 1.1, SSLv3) vengono rifiutati.
Quando usarlo
Usa per applicare uno standard di sicurezza minimo. TLS 1.2 è richiesto per la conformità PCI-DSS ed è supportato da tutti i server moderni. La maggior parte delle build moderne di curl usa già TLS 1.2+ per default, ma questo flag lo rende esplicito.
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3: Forza TLS 1.3 minimo

Cosa fa
Il flag --tlsv1.3 forza curl a usare TLS 1.3 — la versione TLS più veloce e sicura. TLS 1.3 elimina il round-trip extra nell'handshake (supporto 0-RTT) e rimuove tutte le suite di cifratura obsolete.
Quando usarlo
Usa quando sai che il server supporta TLS 1.3 e vuoi le migliori prestazioni e sicurezza. Nota: TLS 1.3 richiede OpenSSL 1.1.1+ o una libreria TLS compatibile. Non tutti i server lo supportano ancora.
$ curl --tlsv1.3 https://modern-api.example.com/data

Opzioni SSL/TLS aggiuntive

--ssl-reqd

Richiedi SSL/TLS per la connessione (fallisci se non disponibile)

--ciphers

Specifica quali cipher SSL usare per la connessione

--cert-type

Specifica il tipo di certificato client (PEM, DER, ENG, P12)

--pinnedpubkey

Fissa e verifica la chiave pubblica del server (stile HPKP)

curl -x: Usa un proxy HTTP/HTTPS

Cosa fa
Il flag -x (o --proxy) instrada tutto il traffico curl attraverso il server proxy specificato. Il formato è [protocol://]host[:port]. Protocolli proxy supportati: HTTP, HTTPS, SOCKS4, SOCKS5.
Quando usarlo
Usa per server proxy aziendali, debug con strumenti come Fiddler, Charles o mitmproxy, test di restrizioni geografiche, o quando l'accesso diretto a Internet non è disponibile. Puoi anche impostare le variabili d'ambiente http_proxy / https_proxy in alternativa.
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5: Usa un proxy SOCKS5

Cosa fa
Il flag --socks5 indica a curl di usare un proxy SOCKS5 per la connessione TCP. A differenza dei proxy HTTP, SOCKS5 opera a livello TCP e può gestire qualsiasi protocollo — non solo HTTP. La risoluzione DNS è locale per default; usa --socks5-hostname per risolvere il DNS attraverso il proxy.
Quando usarlo
Usa per tunnel SSH (ssh -D), accesso alla rete Tor, o quando il proxy deve gestire protocolli non-HTTP. SOCKS5 supporta UDP e può opzionalmente gestire il DNS — rendendolo più flessibile dei proxy HTTP.
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user: Autenticazione proxy

Cosa fa
Il flag --proxy-user (o -U) invia le credenziali di autenticazione al server proxy. Il formato è user:password. Questo è separato dall'autenticazione del server (-u).
Quando usarlo
Necessario quando il server proxy richiede autenticazione — comune in ambienti di rete aziendali e enterprise. Le credenziali vengono inviate al proxy, non al server di destinazione.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy: Bypassa il proxy per host specifici

Cosa fa
Il flag --noproxy specifica un elenco separato da virgole di host, domini o indirizzi IP che dovrebbero bypassare il proxy e connettersi direttamente. Supporta i caratteri jolly: *.example.com corrisponde a tutti i sottodomini.
Quando usarlo
Usa per escludere localhost, servizi interni o domini specifici dal proxying. Questo è importante quando un proxy è impostato globalmente tramite variabili d'ambiente ma alcuni host (come i servizi locali) necessitano di accesso diretto. Usa * per bypassare il proxy per tutti gli host.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

Opzioni proxy aggiuntive

--socks5-hostname

Proxy SOCKS5 con risoluzione DNS attraverso il proxy

--proxy-cacert

Certificato CA per verificare il proxy HTTPS stesso

curl --resolve: Risoluzione DNS personalizzata

Cosa fa
Il flag --resolve fornisce un indirizzo IP personalizzato per una specifica coppia host:port, bypassando completamente la ricerca DNS. Il formato è host:port:address. Si possono fornire più voci --resolve.
Quando usarlo
Essenziale per i test prima della propagazione DNS, la verifica di un backend specifico dietro un load balancer, o lo sviluppo locale dove serve un hostname reale per la validazione del certificato SSL. A differenza della modifica di /etc/hosts, questo è per-request e specifico per la porta.
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to: Reindirizza la connessione a un host diverso

Cosa fa
Il flag --connect-to reindirizza la connessione TCP a una diversa coppia host:port mantenendo l'URL originale per la richiesta HTTP (incluso l'header Host e l'SNI). Formato: HOST1:PORT1:HOST2:PORT2.
Quando usarlo
Usa per testare un server backend specifico dietro un load balancer senza modificare il DNS o /etc/hosts. A differenza di --resolve, questo mappa host:port a host:port (non a un IP), utile quando anche il target ha un hostname.
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

Opzioni di rete aggiuntive

--local-port

Imposta il numero di porta locale o l'intervallo per la connessione

--interface

Vincola la connessione a un'interfaccia di rete specifica

--dns-servers

Usa server DNS personalizzati invece dei predefiniti di sistema (c-ares)

Scenari SSL e Proxy reali

Questi esempi combinano più flag per gestire le attività comuni di sicurezza e rete negli ambienti di sviluppo, CI/CD e production.

Test HTTPS su Localhost

Quando sviluppi localmente con un certificato autofirmato, combina --resolve con --cacert (o -k per test rapidi). Questo ti permette di usare un hostname reale per la corretta validazione SSL/SNI senza modificare il file hosts.

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

Mutual TLS (Autenticazione con certificato client)

Alcune API richiedono che sia il server che il client presentino certificati. Fornisci --cert, --key e --cacert per stabilire una connessione TLS bidirezionale completamente verificata.

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

Proxy aziendale con autenticazione

Nelle reti aziendali con server proxy obbligatori, combina -x con -U per le credenziali proxy. Aggiungi --noproxy per escludere i servizi interni dal proxying.

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

Container Docker con CA interna

Quando i servizi in Docker usano certificati da una CA interna, monta il certificato CA nel container e riferiscilo con --cacert. Questo è più sicuro di -k perché valida ancora la catena di certificati.

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

Proxy SOCKS5 via tunnel SSH

Crea un proxy SOCKS5 con ssh -D e instrada il traffico curl attraverso di esso usando --socks5. Questo è utile per accedere ai servizi interni attraverso un bastion host.

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

Domande frequenti su curl SSL e Proxy

Come posso saltare la verifica del certificato SSL in curl?

Usa curl -k URL o curl --insecure URL. Questo disabilita tutti i controlli sui certificati — scadenza, mancata corrispondenza hostname, CA non affidabile. Usa solo per lo sviluppo locale. Per production, usa --cacert con il certificato CA effettivo.

Come faccio a far fidare curl di un certificato autofirmato?

Usa curl --cacert /percorso/ca.pem URL per specificare il certificato CA che ha firmato il tuo certificato autofirmato. Questo è più sicuro di -k perché valida ancora la catena di certificati — fidandosi solo della tua CA specifica.

Come posso verificare quale versione TLS sta usando curl?

Esegui curl -v URL e cerca la riga * SSL connection using TLSv1.x / CipherSuite nell'output verbose. Per forzare una versione specifica, usa --tlsv1.2 o --tlsv1.3.

Cos'è il mutual TLS (mTLS) e come lo uso con curl?

Il mutual TLS richiede che sia il server che il client presentino certificati. Uso: curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL. La coppia --cert/--key autentica il client; --cacert verifica il server.

Come posso usare curl attraverso un proxy HTTP?

Usa curl -x http://proxy:port URL. Per un proxy HTTPS: curl -x https://proxy:port URL. In alternativa, imposta le variabili d'ambiente http_proxy e https_proxy — curl le rileva automaticamente.

Come posso usare curl con un proxy SOCKS5?

Usa curl --socks5 host:port URL per la risoluzione DNS locale, o curl --socks5-hostname host:port URL per risolvere il DNS attraverso il proxy (importante per privacy/Tor). Esempio con tunnel SSH: ssh -D 1080 user@bastion, poi curl --socks5 localhost:1080 URL.

Come posso autenticarmi con un server proxy in curl?

Usa curl -x http://proxy:port -U user:password URL. Il flag -U (o --proxy-user) invia le credenziali al proxy. Questo è separato da -u, che autentica con il server di destinazione.

Come posso escludere certi host dal proxy in curl?

Usa --noproxy "localhost,127.0.0.1,*.internal.com" o imposta la variabile d'ambiente NO_PROXY. Supporta i caratteri jolly (*.example.com). Usa --noproxy "*" per bypassare il proxy completamente per una singola richiesta.

Come posso testare HTTPS su localhost con curl?

Per test rapidi: curl -k https://localhost:8443/. Per validazione corretta: curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/. L'approccio --resolve permette al nome host del certificato di corrispondere correttamente.

Come posso sovrascrivere la risoluzione DNS per un host specifico in curl?

Usa curl --resolve host:port:IP URL. Esempio: curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/. Questo bypassa il DNS solo per quella coppia host:port — non serve modificare /etc/hosts.

Come posso risolvere 'SSL certificate problem: certificate has expired' in curl?

Il certificato del server è scaduto. Soluzioni: (1) Rinnova il certificato sul server, (2) Aggiorna il bundle CA: curl --cacert /percorso/ca-aggiornato.pem URL, (3) Solo per test: curl -k URL. Verifica la scadenza: curl -v URL 2>&1 | grep expire.

È sicuro usare curl --insecure (-k) in production?

No. Il flag -k disabilita tutta la validazione dei certificati — scadenza, hostname e catena di fiducia. Questo rende la connessione vulnerabile ad attacchi man-in-the-middle. Usa sempre --cacert con il certificato CA specifico in production e nelle pipeline CI/CD.