Guía de configuración de curl SSL, TLS y Proxy

Configurar certificados HTTPS, versiones de TLS, proxies y resolución DNS personalizada en curl es esencial para la comunicación segura con APIs, pipelines CI/CD y la solución de problemas de red. Esta guía cubre todos los flags de SSL, TLS, proxy y red — desde deshabilitar la verificación de certificados con -k hasta configurar mutual TLS con --cert y enrutar tráfico a través de proxies SOCKS5. Cada opción incluye una explicación clara, consideraciones de seguridad y un ejemplo listo para copiar.

Referencia rápida de flags SSL y Proxy

-kSSL/TLS

Permitir conexiones inseguras — omitir toda verificación SSL

--cacertSSL/TLS

Verificar el certificado del servidor contra un bundle CA específico

--certSSL/TLS

Especificar un certificado de cliente para autenticación mutual TLS

--keySSL/TLS

Especificar el archivo de clave privada para el certificado de cliente

--tlsv1.2SSL/TLS

Usar TLS versión 1.2 o superior para la conexión

--tlsv1.3SSL/TLS

Usar TLS versión 1.3 o superior para la conexión

--ssl-reqdSSL/TLS

Requerir SSL/TLS para la conexión (error si no está disponible)

--ciphersSSL/TLS

Especificar qué cifrados SSL usar para la conexión

--cert-typeSSL/TLS

Especificar tipo de certificado de cliente (PEM, DER, ENG, P12)

--pinnedpubkeySSL/TLS

Fijar y verificar la clave pública del servidor (estilo HPKP)

-xProxy

Enrutar todo el tráfico a través del servidor proxy especificado

Enrutar la conexión a través de un proxy SOCKS5

Especificar usuario:contraseña para el servidor proxy

Lista de hosts que no deben pasar por el proxy

--socks5-hostnameProxy

Proxy SOCKS5 con resolución DNS a través del proxy

--proxy-cacertProxy

Certificado CA para verificar el propio proxy HTTPS

Asignar un par host:port específico a una dirección IP personalizada

Conectar a un host:port diferente al que indica la URL

--local-portRed

Establecer número o rango de puerto local para la conexión

--interfaceRed

Vincular la conexión a una interfaz de red específica

--dns-serversRed

Usar servidores DNS personalizados en lugar del predeterminado del sistema (c-ares)

curl -k: Ignorar errores de certificado SSL

Qué hace
El flag -k (o --insecure) deshabilita toda verificación de certificados SSL/TLS. curl no comprobará si el certificado del servidor está firmado por una CA de confianza, si el nombre de host coincide o si el certificado ha expirado.
Cuándo usarlo
Usa solo para desarrollo local con certificados autofirmados o entornos de prueba. Para staging/producción, usa --cacert con el certificado CA real — es más seguro y más explícito.
$ curl -k https://localhost:8443/api/health

Nunca uses -k en scripts de producción o pipelines CI/CD. Deshabilita toda validación de certificados, lo que hace tu conexión vulnerable a ataques man-in-the-middle. Usa --cacert para confiar en una CA específica.

curl --cacert: Usar un certificado CA personalizado

Qué hace
El flag --cacert indica a curl que verifique el certificado SSL del servidor contra un archivo de bundle CA (Certificate Authority) específico en formato PEM, en lugar del almacén de confianza del sistema.
Cuándo usarlo
Úsalo cuando tu servidor use un certificado firmado por una CA privada o interna que no está en el almacén de confianza del sistema. Esto es común en entornos corporativos, clústeres Kubernetes y configuraciones Docker con PKI interna.
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert: Certificado de cliente (Mutual TLS)

Qué hace
El flag --cert proporciona un certificado del lado del cliente para mutual TLS (mTLS). En mTLS, tanto el servidor como el cliente presentan certificados para verificar la identidad del otro. El archivo de certificado debe estar en formato PEM o PKCS#12.
Cuándo usarlo
Requerido cuando el servidor exige autenticación con certificado de cliente — común en APIs bancarias, servicios gubernamentales, comunicación de dispositivos IoT y arquitecturas zero-trust. Combina siempre con --key a menos que la clave esté incrustada en el archivo del certificado.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key: Clave privada del certificado de cliente

Qué hace
El flag --key especifica el archivo de clave privada que se empareja con el certificado de cliente proporcionado mediante --cert. La clave debe coincidir con el certificado. Si la clave está protegida con contraseña, curl solicitará la contraseña (o usa --pass).
Cuándo usarlo
Usa siempre junto con --cert. Si la clave privada ya está incrustada en el archivo del certificado (común con archivos PKCS#12 / .p12), puedes omitir --key.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2: Forzar TLS 1.2 mínimo

Qué hace
El flag --tlsv1.2 obliga a curl a usar TLS 1.2 como versión mínima aceptable para el handshake SSL/TLS. Los protocolos más antiguos (TLS 1.0, 1.1, SSLv3) son rechazados.
Cuándo usarlo
Úsalo para imponer un estándar mínimo de seguridad. TLS 1.2 es requerido para el cumplimiento de PCI-DSS y es soportado por todos los servidores modernos. La mayoría de los builds modernos de curl ya usan TLS 1.2+ por defecto, pero este flag lo hace explícito.
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3: Forzar TLS 1.3 mínimo

Qué hace
El flag --tlsv1.3 obliga a curl a usar TLS 1.3 — la versión más rápida y segura de TLS. TLS 1.3 elimina el round-trip adicional en el handshake (soporte 0-RTT) y elimina todos los cipher suites obsoletos.
Cuándo usarlo
Úsalo cuando sepas que el servidor soporta TLS 1.3 y quieras el mejor rendimiento y seguridad. Nota: TLS 1.3 requiere OpenSSL 1.1.1+ o una biblioteca TLS compatible. No todos los servidores lo soportan aún.
$ curl --tlsv1.3 https://modern-api.example.com/data

Opciones adicionales de SSL/TLS

--ssl-reqd

Requerir SSL/TLS para la conexión (error si no está disponible)

--ciphers

Especificar qué cifrados SSL usar para la conexión

--cert-type

Especificar tipo de certificado de cliente (PEM, DER, ENG, P12)

--pinnedpubkey

Fijar y verificar la clave pública del servidor (estilo HPKP)

curl -x: Usar un proxy HTTP/HTTPS

Qué hace
El flag -x (o --proxy) enruta todo el tráfico de curl a través del servidor proxy especificado. El formato es [protocol://]host[:port]. Protocolos de proxy soportados: HTTP, HTTPS, SOCKS4, SOCKS5.
Cuándo usarlo
Úsalo para proxies corporativos, depuración con herramientas como Fiddler, Charles o mitmproxy, pruebas de restricciones geográficas o cuando no hay acceso directo a internet. También puedes establecer las variables de entorno http_proxy / https_proxy.
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5: Usar un proxy SOCKS5

Qué hace
El flag --socks5 indica a curl que use un proxy SOCKS5 para la conexión TCP. A diferencia de los proxies HTTP, SOCKS5 opera a nivel TCP y puede manejar cualquier protocolo — no solo HTTP. La resolución DNS se realiza localmente por defecto; usa --socks5-hostname para resolver DNS a través del proxy.
Cuándo usarlo
Úsalo para túneles SSH (ssh -D), acceso a la red Tor o cuando el proxy necesita manejar protocolos no HTTP. SOCKS5 soporta UDP y puede opcionalmente manejar DNS — haciéndolo más flexible que los proxies HTTP.
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user: Autenticación de proxy

Qué hace
El flag --proxy-user (o -U) envía credenciales de autenticación al servidor proxy. El formato es user:password. Esto es independiente de la autenticación del servidor (-u).
Cuándo usarlo
Requerido cuando el servidor proxy exige autenticación — común en redes corporativas y empresariales. Las credenciales se envían al proxy, no al servidor de destino.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy: Omitir proxy para hosts específicos

Qué hace
El flag --noproxy especifica una lista separada por comas de hosts, dominios o direcciones IP que deben omitir el proxy y conectarse directamente. Soporta comodines: *.example.com coincide con todos los subdominios.
Cuándo usarlo
Úsalo para excluir localhost, servicios internos o dominios específicos del proxy. Esto es importante cuando un proxy está configurado globalmente mediante variables de entorno pero algunos hosts (como servicios locales) necesitan acceso directo. Usa * para omitir el proxy para todos los hosts.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

Opciones adicionales de proxy

--socks5-hostname

Proxy SOCKS5 con resolución DNS a través del proxy

--proxy-cacert

Certificado CA para verificar el propio proxy HTTPS

curl --resolve: Resolución DNS personalizada

Qué hace
El flag --resolve proporciona una dirección IP personalizada para un par host:port específico, omitiendo completamente las búsquedas DNS. El formato es host:port:address. Se pueden especificar múltiples entradas --resolve.
Cuándo usarlo
Esencial para pruebas antes de la propagación DNS, verificación de un backend específico detrás de un balanceador de carga o desarrollo local donde necesitas un nombre de host real para la validación del certificado SSL. A diferencia de editar /etc/hosts, esto es por solicitud y específico del puerto.
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to: Redirigir conexión a otro host

Qué hace
El flag --connect-to redirige la conexión TCP a un par host:port diferente manteniendo la URL original para la solicitud HTTP (incluyendo el encabezado Host y SNI). Formato: HOST1:PORT1:HOST2:PORT2.
Cuándo usarlo
Úsalo para probar un servidor backend específico detrás de un balanceador de carga sin cambiar DNS o /etc/hosts. A diferencia de --resolve, esto mapea host:port a host:port (no a una IP), lo cual es útil cuando el destino también tiene un nombre de host.
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

Opciones adicionales de red

--local-port

Establecer número o rango de puerto local para la conexión

--interface

Vincular la conexión a una interfaz de red específica

--dns-servers

Usar servidores DNS personalizados en lugar del predeterminado del sistema (c-ares)

Escenarios reales de SSL y Proxy

Estos ejemplos combinan múltiples flags para manejar tareas comunes de seguridad y red en desarrollo, CI/CD y entornos de producción.

Probar HTTPS en Localhost

Durante el desarrollo local con un certificado autofirmado, combina --resolve con --cacert (o -k para pruebas rápidas). Esto te permite usar un nombre de host real para SSL/SNI correcto sin modificar tu archivo hosts.

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

Mutual TLS (autenticación con certificado de cliente)

Algunas APIs requieren que tanto el servidor como el cliente presenten certificados. Especifica --cert, --key y --cacert para establecer una conexión TLS bidireccional completamente verificada.

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

Proxy corporativo con autenticación

En redes corporativas con servidores proxy obligatorios, combina -x con -U para credenciales de proxy. Añade --noproxy para excluir servicios internos del proxy.

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

Contenedor Docker con CA interna

Cuando los servicios en Docker usan certificados de una CA interna, monta el certificado CA en el contenedor y referéncialo con --cacert. Esto es más seguro que -k porque sigue validando la cadena de certificados.

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

Proxy SOCKS5 mediante túnel SSH

Crea un proxy SOCKS5 con ssh -D y enruta el tráfico de curl a través de él con --socks5. Esto es útil para acceder a servicios internos a través de un host bastión.

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

Preguntas frecuentes sobre curl SSL y Proxy

¿Cómo omito la verificación de certificado SSL en curl?

Usa curl -k URL o curl --insecure URL. Esto deshabilita todos los controles de certificado — expiración, discrepancia de nombre de host, CA no confiable. Úsalo solo para desarrollo local. Para producción, usa --cacert con el certificado CA real.

¿Cómo hago que curl confíe en un certificado autofirmado?

Usa curl --cacert /ruta/a/ca.pem URL para especificar el certificado CA que firmó tu certificado autofirmado. Esto es más seguro que -k porque sigue validando la cadena de certificados — y solo confía en tu CA específica.

¿Cómo verifico qué versión de TLS está usando curl?

Ejecuta curl -v URL y busca la línea * SSL connection using TLSv1.x / CipherSuite en la salida detallada. Para forzar una versión específica, usa --tlsv1.2 o --tlsv1.3.

¿Qué es mutual TLS (mTLS) y cómo lo uso con curl?

Mutual TLS requiere que tanto el servidor como el cliente presenten certificados. Uso: curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL. El par --cert/--key autentica al cliente; --cacert verifica al servidor.

¿Cómo uso curl a través de un proxy HTTP?

Usa curl -x http://proxy:puerto URL. Para un proxy HTTPS: curl -x https://proxy:puerto URL. Alternativamente, establece las variables de entorno http_proxy y https_proxy — curl las detecta automáticamente.

¿Cómo uso curl con un proxy SOCKS5?

Usa curl --socks5 host:puerto URL para resolución DNS local o curl --socks5-hostname host:puerto URL para resolver DNS a través del proxy (importante para privacidad/Tor). Ejemplo con túnel SSH: ssh -D 1080 user@bastion, luego curl --socks5 localhost:1080 URL.

¿Cómo me autentico con un servidor proxy en curl?

Usa curl -x http://proxy:puerto -U user:password URL. El flag -U (o --proxy-user) envía credenciales al proxy. Esto es independiente de -u, que autentica con el servidor de destino.

¿Cómo excluyo hosts específicos del proxy en curl?

Usa --noproxy "localhost,127.0.0.1,*.internal.com" o establece la variable de entorno NO_PROXY. Soporta comodines (*.example.com). Usa --noproxy "*" para omitir el proxy completamente para una solicitud individual.

¿Cómo pruebo HTTPS en localhost con curl?

Para pruebas rápidas: curl -k https://localhost:8443/. Para validación correcta: curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/. El enfoque --resolve permite que el nombre de host del certificado coincida correctamente.

¿Cómo sobrescribo la resolución DNS para un host específico en curl?

Usa curl --resolve host:puerto:IP URL. Ejemplo: curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/. Esto omite DNS solo para ese par host:puerto — sin necesidad de editar /etc/hosts.

¿Cómo soluciono 'SSL certificate problem: certificate has expired' en curl?

El certificado del servidor ha expirado. Soluciones: (1) Renovar el certificado en el servidor, (2) Actualizar el bundle CA: curl --cacert /ruta/a/ca-actualizada.pem URL, (3) Solo para pruebas: curl -k URL. Verificar expiración: curl -v URL 2>&1 | grep expire.

¿Es seguro usar curl --insecure (-k) en producción?

No. El flag -k deshabilita toda validación de certificados — expiración, nombre de host y cadena de confianza. Esto hace tu conexión vulnerable a ataques man-in-the-middle. Usa siempre --cacert con el certificado CA específico en producción y pipelines CI/CD.