BlogIngeniería de IA
Ingeniería de IA16 min de lectura· 9 de julio de 2026

Error de certificado SSL en Claude Code

Carolina Fogliato

Publicado el 3 de julio de 2026 · actualizado el 9 de julio de 2026

¿Claude Code lanza SELF_SIGNED_CERT_IN_CHAIN detrás de un proxy corporativo? Cinco arreglos — OS trust store, NODE_EXTRA_CA_CERTS y HTTPS_PROXY — sin desactivar TLS, más el único "arreglo" que filtra tu API key.

Claude Code que funcionaba en casa se para en la oficina con un muro de ruido TLS: SELF_SIGNED_CERT_IN_CHAIN, unable to get local issuer certificate, o un lacónico Self-signed certificate detected.

Nada está mal en tu instalación. La red de tu empresa está abriendo cada conexión HTTPS, re-firmándola, y Claude Code no reconoce la nueva firma.

Esta guía cubre las cinco formas de arreglarlo, en el orden en que deberías probarlas, más los ajustes de proxy que van con ellas — y el único "arreglo" que le entrega tu API key a cualquiera en el cable.

Si prefieres que alguien lo configure para todo un equipo, también hacemos eso.


DIAGNÓSTICO EN 30 SEGUNDOS

Lee el string de error primero

El string de error te dice qué capa está fallando, y cada uno mapea a un fix específico más abajo.

String de errorQué significaPrimer fix a probar
SELF_SIGNED_CERT_IN_CHAINUn proxy re-firmó el tráfico con una CA en la que no confías.Fix 1 (OS store) o Fix 2 (NODE_EXTRA_CA_CERTS)
unable to get local issuer certificateLa CA emisora no está en ningún store que Claude Code lea.Fix 2 (NODE_EXTRA_CA_CERTS)
Self-signed certificate detectedLa propia redacción de Claude Code para los dos anteriores.Fix 1, luego Fix 2
CERT_HAS_EXPIREDDesfase de reloj, o un cert de interceptación caduco.Comprueba el reloj del sistema, luego Fix 1
curl: (35) TLS connect error on installEl handshake falla antes de que la instalación empiece.Fix 3 (flags de instalación)
schannel: ... SSL/TLS secure channel (Windows)Trust de Windows o versión de TLS al instalar.Fix 3 (TLS 1.2, revocación)

Una prueba resuelve la causa en diez segundos. Ejecuta Claude Code en una red sin inspección — un hotspot del móvil sirve — o pide a IT una regla de bypass para api.anthropic.com. Si conecta ahí y falla en la red corporativa, el proxy está re-firmando tu tráfico y necesitas un fix de CA, no una reinstalación.


PRIMERA DECISIÓN

¿Arreglar la confianza o enrutar alrededor?

Antes de tocar un archivo de config, decide qué problema tienes de verdad. Los fixes de certificado asumen que puedes conseguir la CA de tu empresa y poner una variable de entorno. No siempre es cierto, y forzarlo desperdicia una tarde.

Añade la CA (Fix 1–5) cuando

  • Controlas la máquina y puedes poner variables de entorno o editar ~/.claude/settings.json.
  • IT puede darte el archivo de la CA raíz, o ya está instalada en el OS trust store.
  • El proxy usa pass-through plano o autenticación básica.

Enruta por un gateway cuando

  • El proxy exige autenticación NTLM o Kerberos, que Claude Code no habla.
  • No puedes obtener la CA corporativa y IT no va a allowlistear los dominios de Anthropic.
  • Necesitas un punto de salida con su propia terminación TLS para todo un equipo, para que el malabarismo de CA por desarrollador deje de valer la pena.

Regla de parada. Si Claude Code conecta en una red directa y solo se rompe detrás del proxy corporativo, es un problema de confianza, sin más. No reinstales, no cambies de versión de Node a ciegas, no abras un ticket sobre un "binario roto." Salta a Fix 1. Si también falla en una red limpia, la causa es otra — DNS, un bloqueo regional, una suscripción caducada — y los fixes de certificado de aquí no ayudarán.


POR QUÉ CLAUDE CODE RECHAZA EL CERT

Tu red está re-firmando el tráfico

La mayoría de redes corporativas usan un proxy de inspección TLS. Saber qué hace te dice por qué aparece el error y dónde está el fix.

Zscaler, Netskope, Cato, CrowdStrike Falcon o un VPN de túnel completo hacen lo mismo: leer el HTTPS saliente para prevención de pérdida de datos y escaneo de malware. Para leer un flujo cifrado, la caja tiene que sentarse en el medio. Termina tu conexión a api.anthropic.com, la descifra, luego hace su propia conexión hacia adelante y re-firma la respuesta con la autoridad certificadora privada de la empresa.

Tu navegador confía en ese cert re-firmado porque IT empujó la CA raíz corporativa al navegador y al OS trust store cuando configuraron el portátil. Claude Code es un runtime aparte con su propia idea de en qué confiar — y ahí es donde vive el desajuste.

Aquí está la parte que la mayoría de write-ups erran. El Claude Code moderno ya lee tu OS trust store. Por defecto confía tanto en su set de Mozilla embebido como en el almacén de certificados del sistema operativo. Leer el OS store necesita un runtime que exponga tls.getCACertificates: el instalador nativo siempre lo tiene, y los installs por npm necesitan Node 22.15 o superior. En Node antiguo solo aplican el set embebido y NODE_EXTRA_CA_CERTS. Así que cuando IT ha instalado la raíz corporativa en el OS store y estás en un build actual, proxies de inspección como Zscaler y CrowdStrike Falcon funcionan sin configuración extra. Los errores aparecen en los huecos: un install viejo por npm, una CA que nunca llegó al OS store, o un runtime lanzado de forma que se lo salta.


LEER EL ERROR

Strings y alcance

El string exacto acota la causa. Es la misma taxonomía que usan Node y OpenSSL, así que aplica tanto si Claude Code corre en el binario nativo como en un install por npm.

ErrorCapaCausa de fondoAlcance
SELF_SIGNED_CERT_IN_CHAINVerificación TLSCA raíz del proxy ausente del trust storeCada llamada a la API
unable to get local issuer certificateVerificación TLSCA intermedia o raíz ausente de la cadenaCada llamada a la API
CERT_HAS_EXPIREDVerificación TLSReloj del sistema equivocado, o un cert de interceptación caducoCada llamada a la API
schannel: ... secure channelTLS de WindowsTrust store de Windows o versión de TLS al instalarPaso de instalación
CRYPT_E_NO_REVOCATION_CHECK (0x80092012)Revocación de WindowsLa red bloquea la consulta de revocación (OCSP/CRL)Paso de instalación
CRYPT_E_REVOCATION_OFFLINE (0x80092013)Revocación de WindowsEndpoint de revocación inalcanzable tras el firewallPaso de instalación

La distinción importa. Un error de verificación en cada llamada a la API es un problema de trust store que se arregla una vez con una CA. Un error de revocación al instalar es el firewall bloqueando una consulta, y lo rodeas para ese único comando de instalación en vez de cambiar tu configuración de confianza.


LOS ARREGLOS

Los fixes, en orden

Ve de arriba a abajo. Los primeros son más limpios y menos arriesgados que los últimos.

Fix 1: Deja que Claude Code use el OS trust store

Si IT ya puso la CA corporativa en tu system store — casi siempre lo hacen, porque el navegador la necesita — el fix más limpio es asegurarte de que Claude Code lea ese store en vez de pelear con él.

En el instalador nativo es automático. En un install por npm, confirma que tu Node es 22.15 o superior:

node --version

Si es anterior, actualiza Node o pasa al instalador nativo, que nunca depende de la versión de Node para la confianza. El valor por defecto de CLAUDE_CODE_CERT_STORE ya es bundled,system, así que Claude Code lee el OS store tal cual. Solo tocas esta variable si alguien la forzó a bundled, que quita el OS store; en ese caso vuelve a poner system:

export CLAUDE_CODE_CERT_STORE=bundled,system

Resultado esperado: Claude Code confía en lo que tu OS confía, incluida la raíz corporativa. Forzar system solo no añade confianza que el valor por defecto no tuviera ya, así que no rescata un runtime demasiado viejo para leer el OS store. Si el OS store mismo no tiene la CA, eso es Fix 2.

Fix 2: Apunta NODE_EXTRA_CA_CERTS a la CA corporativa

Este es el fix de caballo de batalla, y el que los docs de Anthropic nombran para entornos con inspección TLS. Añade tu raíz corporativa encima del set integrado sin reemplazar nada.

Primero consigue el archivo de CA en formato PEM. Pídelo a IT, o expórtalo tú: en macOS abre Keychain Access y exporta la raíz corporativa como .pem; en Windows ejecuta certmgr.msc, abre Trusted Root Certification Authorities y exporta como X.509 codificado en Base-64; en Linux el archivo ya suele vivir en /usr/local/share/ca-certificates o /etc/pki/ca-trust.

Luego apunta Claude Code a él:

export NODE_EXTRA_CA_CERTS=/ruta/a/corporate-ca.pem
claude

Resultado esperado: las llamadas a la API funcionan porque Claude Code ahora confía en el cert re-firmado del proxy. Hazlo permanente añadiendo el export a ~/.zshrc o ~/.bashrc. Si tu bundle de CA tiene varios certs (una raíz más intermedios), concaténalos en un único archivo PEM; NODE_EXTRA_CA_CERTS los lee todos.

Fix 3: Arregla el paso de instalación por separado

La instalación y el runtime son dos llamadas de red distintas, y pueden fallar de forma independiente. Si curl se atraganta antes de que Claude Code se instale, parchea el comando de instalación, no tu shell profile.

Apunta el curl del instalador al mismo bundle de CA:

curl --cacert /ruta/a/corporate-ca.pem -fsSL https://claude.ai/install.sh | bash

En Windows, si ves el error schannel secure-channel, fuerza TLS 1.2 primero:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
irm https://claude.ai/install.ps1 | iex

Si Windows reporta CRYPT_E_NO_REVOCATION_CHECK o CRYPT_E_REVOCATION_OFFLINE, la red está bloqueando la consulta de revocación, común tras firewalls corporativos. Añade revocación de best-effort solo a la instalación:

curl --ssl-revoke-best-effort -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

Resultado esperado: el binario se instala. Las llamadas a la API en runtime siguen gobernadas por Fix 1 o Fix 2, así que pon esos también.

Fix 4: Configura el proxy en sí

A veces el certificado está bien pero no se está usando el proxy. Claude Code lee las variables de proxy estándar. HTTPS_PROXY es la que importa para el tráfico de API:

export HTTPS_PROXY=https://proxy.ejemplo.com:8080
export HTTP_PROXY=http://proxy.ejemplo.com:8080
export NO_PROXY="localhost,127.0.0.1,.internal.ejemplo.com"

NO_PROXY toma una lista separada por espacios o comas, y * omite el proxy para todo. Si el proxy necesita auth básica, pon las credenciales en la URL:

export HTTPS_PROXY=http://usuario:password@proxy.ejemplo.com:8080

Dos límites que conviene conocer antes de perder tiempo: Claude Code no soporta proxies SOCKS, y no maneja autenticación NTLM o Kerberos — que es justo el caso del que trata la sección del gateway.

Fix 5: mTLS y entornos con certificado de cliente

Algunas empresas exigen un certificado de cliente, no solo uno de servidor confiable. Claude Code soporta TLS mutuo con tres variables:

export CLAUDE_CODE_CLIENT_CERT=/ruta/a/client-cert.pem
export CLAUDE_CODE_CLIENT_KEY=/ruta/a/client-key.pem
export CLAUDE_CODE_CLIENT_KEY_PASSPHRASE="tu-passphrase"

Resultado esperado: Claude Code presenta el certificado de cliente durante el handshake, satisfaciendo a un proxy o gateway que autentica a los llamadores por certificado en vez de por cabecera.

El anti-fix: nunca desactives la verificación

Encontrarás NODE_TLS_REJECT_UNAUTHORIZED=0 recomendado en foros. Hace que el error desaparezca porque le dice a Node que acepte cualquier certificado de cualquiera. Eso incluye a un atacante en la misma red de la cafetería, que ahora puede leer la API key que envías en cada petición en texto plano.

Es la única línea que nunca deberías commitear. Añadir la CA mantiene la validación activa y confía solo en el certificado que elegiste; desactivar la validación confía en todo. No es lo mismo.


RECORRIDO COMPLETO

Zscaler en macOS, de punta a punta

Los pasos abstractos son fáciles de errar, así que aquí está todo para el setup más común — un Mac detrás de Zscaler. Toma unos cinco minutos.

  1. 1.Confirma que es de verdad el proxy. Conéctate al móvil y ejecuta claude. Si conecta ahí, la red corporativa está interceptando y continúas abajo.
  2. 2.Exporta la raíz de Zscaler del Keychain. Abre Keychain Access, busca la raíz corporativa (suele llamarse Zscaler Root CA), selecciónala y usa Archivo luego Exportar para guardarla como zscaler-root.pem en tu carpeta de usuario. Si la exporta como .cer, conviértela:
  3. 3.Apunta Claude Code a ella y hazlo persistente:
openssl x509 -inform der -in zscaler-root.cer -out zscaler-root.pem
echo 'export NODE_EXTRA_CA_CERTS="$HOME/zscaler-root.pem"' >> ~/.zshrc
source ~/.zshrc

Abre una terminal nueva para que el export se cargue, luego arranca claude. El error SSL ha desaparecido.

Si curl verifica con ese bundle pero claude sigue fallando, la variable no está llegando al proceso de Claude Code. Es el hueco de shell versus settings.json que se cubre a continuación, no un problema de certificado.

curl --cacert "$NODE_EXTRA_CA_CERTS" -svo /dev/null https://api.anthropic.com 2>&1 | grep -E "issuer|verify"

CONTENEDORES Y CI

Docker, runners de CI y dev remoto

Los contenedores son donde este error reaparece tras creerlo resuelto, porque un contenedor nuevo no hereda el OS trust store de tu portátil. Tu host confía en la CA corporativa; la imagen Ubuntu base dentro de Docker, no.

Mete la CA en la imagen y regístrala tanto en el OS store como en la variable de Node:

COPY corporate-ca.pem /usr/local/share/ca-certificates/corporate-ca.crt
RUN update-ca-certificates
ENV NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corporate-ca.crt

La misma lógica cubre runners de CI y máquinas de dev remoto: un runner de GitHub Actions o GitLab detrás del mismo proxy necesita la CA presente en el entorno del job, normalmente como archivo secreto escrito al inicio del job con NODE_EXTRA_CA_CERTS exportado antes de cualquier paso de claude. Los devcontainers necesitan la línea ENV de arriba en su Dockerfile. Si solo arreglaste tu shell profile, el contenedor nunca lo vio.


DÓNDE PONERLO

settings.json frente al shell

Cada variable de arriba puede vivir en el bloque env de ~/.claude/settings.json, que es la opción ordenada para una máquina que configuras una vez.

{
  "env": {
    "NODE_EXTRA_CA_CERTS": "/ruta/a/corporate-ca.pem",
    "HTTPS_PROXY": "https://proxy.ejemplo.com:8080"
  }
}

Hay una advertencia que conviene decir claro. Algunas versiones anteriores ignoraban NODE_EXTRA_CA_CERTS cuando solo se ponía en settings.json, y la app de escritorio no siempre lo reenviaba al subproceso del CLI que lanza. Ambos han salido como issues rastreados en GitHub. Si el valor de settings.json no hace nada, el fallback fiable es el export del shell en tu profile, que todo build honra porque Node lo lee antes de que arranque Claude Code.

Dónde lo ponesFiabilidadUsa cuando
Shell profile (.zshrc/.bashrc)Máxima — todo build lo leeCualquier cosa, sobre todo si settings.json parece ignorado
Bloque env de ~/.claude/settings.jsonAlta en builds actualesQuieres una config commiteada por máquina
Entorno de la app de escritorioMínima — puede no llegar al subproceso del CLISolo tras confirmar que el CLI la hereda

ERRORES RELACIONADOS

Errores que se confunden con el bug de cert

Estos aparecen junto a los errores de certificado y se confunden con ellos.

SíntomaCausaFix
curl: (56) Failure writing output on installDescarga interrumpida, a menudo por el proxyReintenta, o usa brew/winget que evitan curl en pipe
La instalación devuelve HTML o 403Región no soportada, o un proxy bloqueando downloads.claude.aiConfirma tu región y allowliste el dominio o pon HTTPS_PROXY
unable to get local issuer certificate al instalarFalta la CA durante el paso de curlAñade --cacert (Fix 3)
Un servidor MCP por HTTPS no confía en su certEl endpoint MCP usa un cert self-signedAñade ese cert también a NODE_EXTRA_CA_CERTS
Va en la terminal, falla en la extensión del IDEEl proceso del IDE no heredó tu entorno del shellPon las vars en los ajustes del IDE, o lánzalo desde una terminal

Esa última fila es la silenciosa. Si claude va en tu terminal pero el panel de VS Code o JetBrains lanza el error SSL, el editor se arrancó desde el dock y nunca vio tu .zshrc. Pon las variables en el entorno propio del IDE, o arranca el editor desde un shell donde ya estén exportadas.


CUANDO EL PROXY NO CEDE

Enruta por un gateway

Si el proxy exige NTLM o Kerberos, o simplemente no puedes conseguir la CA, añadir certificados es un callejón sin salida. Pon un LLM gateway delante que hable ese esquema.

Un gateway termina su propio TLS y maneja la negociación sucia del proxy una vez, de modo que cada desarrollador apunta a un endpoint en vez de que cada uno pelee con su propio trust store. Apuntar Claude Code a un endpoint custom es un cambio de una línea — pon dos variables:

export ANTHROPIC_BASE_URL=https://tu-gateway.ejemplo/anthropic
export ANTHROPIC_API_KEY=sk-...

Sé honesto sobre qué resuelve esto y qué no. El proxy corporativo sigue re-firmando el tráfico hacia el host del gateway, así que puede que sigas necesitando la CA corporativa en tu trust store para él. Lo que te compra el gateway es un punto de salida para todo el equipo, una vista única de facturación y uso entre proveedores, y un sitio para poner failover cuando un upstream no responde.

El gateway es la vía de escape, no el valor por defecto. Cuando puedes conseguir la CA, Fix 1 o Fix 2 es más simple y te mantiene en el camino directo.


LO QUE ESTO ENSEÑA DE VERDAD

Una capa de confianza se volvió en silencio un agujero de seguridad

Los arreglos de arriba hacen que Claude Code hable a través de tu proxy. El resto es la parte por la que vale la pena actuar antes de que alguien mande el anti-fix.

Puedes leer este error de dos formas. La estrecha: un proxy re-firma tu tráfico, añade la CA y sigue. La útil: un control de seguridad que tu empresa puso es ahora lo que bloquea tus herramientas — y el workaround al que más gente recurre elimina silenciosamente la protección por completo.

Lo vemos en casi todo sistema de IA que auditamos. Un equipo pone NODE_TLS_REJECT_UNAUTHORIZED=0 en un script para que un error desaparezca, ese script se copia a CI, y un año después un atacante en la red lee cada API key que envía. El error de certificado es una cosa pequeña. El reflejo de desactivar la validación es la vulnerabilidad real.

Tres cosas hacen que un setup sobreviva a estos entornos:

Confía de forma explícita, nunca global

Añade la CA específica que emitió tu empresa. Nunca desactives la validación para todo el proceso — cambia un fix de cinco minutos por una superficie de ataque permanente.

Pon la confianza en el límite, no en el portátil

Mete la CA en la imagen y en el runner de CI. Si la confianza vive solo en el shell profile de un desarrollador, se rompe el día que otro ejecute el pipeline.

Sabe lo que cuesta tu vía de escape

Un gateway resuelve NTLM y la salida del equipo. No quita el proxy corporativo del camino. Cuenta los saltos de confianza antes de asumir que una ruta está limpia.

Si el workaround de tu equipo para un error de certificado es desactivar las verificaciones de certificado, el error no era el problema — lo era el workaround.


FAQ

Preguntas que nos hacen sobre esto

¿Cómo arreglo SELF_SIGNED_CERT_IN_CHAIN en Claude Code?+

Un proxy de inspección TLS re-firmó la conexión con una CA en la que no confías. Instala esa CA en el OS trust store (el instalador nativo y Node 22.15+ la leen solos) o apunta NODE_EXTRA_CA_CERTS al bundle de CA. No desactives la validación.

¿Qué es NODE_EXTRA_CA_CERTS y dónde lo apunto?+

Una variable de Node que añade certificados de confianza encima del set integrado. Apúntala a tu raíz corporativa en formato PEM: export NODE_EXTRA_CA_CERTS=/ruta/a/corporate-ca.pem. Ponlo en el shell o en settings.json.

¿Lee Claude Code el cert store de Windows o macOS?+

Sí, por defecto confía en el set de Mozilla embebido más el OS store. Leer el OS store necesita el instalador nativo o Node 22.15+; Node antiguo usa solo el set embebido y NODE_EXTRA_CA_CERTS.

¿Es seguro NODE_TLS_REJECT_UNAUTHORIZED=0?+

No. Desactiva la validación de certificados en cada petición, exponiendo tu API key a cualquiera en el camino. Añade la CA — mantiene la validación activa y confía solo en el certificado que elegiste.

¿Por qué Claude Code falla con un error SSL cuando curl funciona?+

Leen trust stores distintos. El curl del sistema ya suele confiar en la CA corporativa; el runtime de Claude Code puede que no, o un install por npm está en Node anterior a 22.15. Apunta NODE_EXTRA_CA_CERTS a la misma CA, o pasa al instalador nativo o Node 22.15+ para que lea el OS store.

¿Puedo poner NODE_EXTRA_CA_CERTS en settings.json?+

Sí, en el bloque env. Algunas versiones anteriores solo honraban el export del shell, así que si settings.json no hace nada, expórtalo en tu shell profile — Node lo lee antes de que arranque Claude Code.

¿Soporta Claude Code proxies SOCKS o NTLM?+

No SOCKS, ni auth NTLM o Kerberos directo. Lee HTTP_PROXY, HTTPS_PROXY y NO_PROXY, con auth básica como user:password en la URL. Para NTLM o Kerberos, ponle un gateway delante.

¿Cómo consigo el archivo de CA de mi empresa?+

Pide a IT la CA raíz en formato PEM, o expórtala de Keychain Access (macOS), certmgr.msc (Windows, X.509 en Base-64) o /usr/local/share/ca-certificates (Linux).


Sobre FACTA

FACTA ayuda a startups y equipos en etapa de crecimiento a convertir IA en sistemas de producción que siguen funcionando — no demos que impresionan una vez.

Diseñamos la arquitectura en torno a lo que de verdad se rompe bajo uso real: abstracción de modelo, credenciales que te pertenecen, failover, controles de coste, observabilidad. La infraestructura aburrida que mantiene un sistema vivo después del lanzamiento.

Liderado por Matías Baglieri y Carolina Fogliato, nos centramos en una sola cosa:

Liderazgo de IA que construye. No solo asesora.

Conecta Claude Code a tu red corporativa — sin el agujero de seguridad

La confianza SSL y de proxy es la fricción de tooling que en silencio se vuelve riesgo. Nuestro equipo de automatización de IA configura Claude Code, gateways y la confianza de CI para equipos detrás de proxies de inspección TLS — manteniendo la validación activa y las API keys fuera del cable.

Explorar Automatización de IA
Reserva una llamada de 30 minutos →

Sin venta. Sin presión. Solo una mirada a dónde es frágil tu stack de IA — y qué arreglar primero.

Mantente al día

Recibe insights de IA de producción en tu bandeja

Insights semanales. Sin spam. Cancela cuando quieras.