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 error | Qué significa | Primer fix a probar |
|---|---|---|
| SELF_SIGNED_CERT_IN_CHAIN | Un 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 certificate | La CA emisora no está en ningún store que Claude Code lea. | Fix 2 (NODE_EXTRA_CA_CERTS) |
| Self-signed certificate detected | La propia redacción de Claude Code para los dos anteriores. | Fix 1, luego Fix 2 |
| CERT_HAS_EXPIRED | Desfase de reloj, o un cert de interceptación caduco. | Comprueba el reloj del sistema, luego Fix 1 |
| curl: (35) TLS connect error on install | El 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.
| Error | Capa | Causa de fondo | Alcance |
|---|---|---|---|
| SELF_SIGNED_CERT_IN_CHAIN | Verificación TLS | CA raíz del proxy ausente del trust store | Cada llamada a la API |
| unable to get local issuer certificate | Verificación TLS | CA intermedia o raíz ausente de la cadena | Cada llamada a la API |
| CERT_HAS_EXPIRED | Verificación TLS | Reloj del sistema equivocado, o un cert de interceptación caduco | Cada llamada a la API |
| schannel: ... secure channel | TLS de Windows | Trust store de Windows o versión de TLS al instalar | Paso de instalación |
| CRYPT_E_NO_REVOCATION_CHECK (0x80092012) | Revocación de Windows | La red bloquea la consulta de revocación (OCSP/CRL) | Paso de instalación |
| CRYPT_E_REVOCATION_OFFLINE (0x80092013) | Revocación de Windows | Endpoint de revocación inalcanzable tras el firewall | Paso 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.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.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.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 pones | Fiabilidad | Usa cuando |
|---|---|---|
| Shell profile (.zshrc/.bashrc) | Máxima — todo build lo lee | Cualquier cosa, sobre todo si settings.json parece ignorado |
| Bloque env de ~/.claude/settings.json | Alta en builds actuales | Quieres una config commiteada por máquina |
| Entorno de la app de escritorio | Mínima — puede no llegar al subproceso del CLI | Solo 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íntoma | Causa | Fix |
|---|---|---|
| curl: (56) Failure writing output on install | Descarga interrumpida, a menudo por el proxy | Reintenta, o usa brew/winget que evitan curl en pipe |
| La instalación devuelve HTML o 403 | Región no soportada, o un proxy bloqueando downloads.claude.ai | Confirma tu región y allowliste el dominio o pon HTTPS_PROXY |
| unable to get local issuer certificate al instalar | Falta la CA durante el paso de curl | Añade --cacert (Fix 3) |
| Un servidor MCP por HTTPS no confía en su cert | El endpoint MCP usa un cert self-signed | Añade ese cert también a NODE_EXTRA_CA_CERTS |
| Va en la terminal, falla en la extensión del IDE | El proceso del IDE no heredó tu entorno del shell | Pon 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