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
Permitir conexiones inseguras — omitir toda verificación SSL
Verificar el certificado del servidor contra un bundle CA específico
Especificar un certificado de cliente para autenticación mutual TLS
Especificar el archivo de clave privada para el certificado de cliente
Usar TLS versión 1.2 o superior para la conexión
Usar TLS versión 1.3 o superior para la conexión
Requerir SSL/TLS para la conexión (error si no está disponible)
Especificar qué cifrados SSL usar para la conexión
Especificar tipo de certificado de cliente (PEM, DER, ENG, P12)
Fijar y verificar la clave pública del servidor (estilo HPKP)
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
Proxy SOCKS5 con resolución DNS a través del proxy
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
Establecer número o rango de puerto local para la conexión
Vincular la conexión a una interfaz de red específica
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
--cacertcon el certificado CA real — es más seguro y más explícito.
$ curl -k https://localhost:8443/api/healthNunca 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
--cacertindica 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/datacurl --cert: Certificado de cliente (Mutual TLS)
- Qué hace
- El flag
--certproporciona 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
--keya menos que la clave esté incrustada en el archivo del certificado.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/securecurl --key: Clave privada del certificado de cliente
- Qué hace
- El flag
--keyespecifica 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/securecurl --tlsv1.2: Forzar TLS 1.2 mínimo
- Qué hace
- El flag
--tlsv1.2obliga 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.3obliga 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/dataOpciones adicionales de SSL/TLS
Requerir SSL/TLS para la conexión (error si no está disponible)
Especificar qué cifrados SSL usar para la conexión
Especificar tipo de certificado de cliente (PEM, DER, ENG, P12)
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/datacurl --socks5: Usar un proxy SOCKS5
- Qué hace
- El flag
--socks5indica 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-hostnamepara 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/datacurl --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 esuser: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/datacurl --noproxy: Omitir proxy para hosts específicos
- Qué hace
- El flag
--noproxyespecifica una lista separada por comas de hosts, dominios o direcciones IP que deben omitir el proxy y conectarse directamente. Soporta comodines:*.example.comcoincide 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/apiOpciones adicionales de proxy
Proxy SOCKS5 con resolución DNS a través del proxy
Certificado CA para verificar el propio proxy HTTPS
curl --resolve: Resolución DNS personalizada
- Qué hace
- El flag
--resolveproporciona una dirección IP personalizada para un parhost:portespecífico, omitiendo completamente las búsquedas DNS. El formato eshost: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/healthcurl --connect-to: Redirigir conexión a otro host
- Qué hace
- El flag
--connect-toredirige la conexión TCP a un parhost:portdiferente manteniendo la URL original para la solicitud HTTP (incluyendo el encabezadoHosty 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/healthOpciones adicionales de red
Establecer número o rango de puerto local para la conexión
Vincular la conexión a una interfaz de red específica
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/statusMutual 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/dataProxy 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/dataContenedor 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/healthProxy 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/statusPreguntas 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.