Proxy interno de la empresa y aplicaciones de Windows — Cómo se resuelve el proxy en WinINET, WinHTTP y .NET

· Actualizado el: · · Windows, Proxy, WinHTTP, WinINET, .NET, HttpClient, PAC, WPAD, Redes

Historial de revisiones (primera versión, publicada el 20 Aug 2026)
Primera publicación
Citar este artículo(DOI (archivo registrado): 10.5281/zenodo.22176214)

Los DOI siguientes remiten a versiones ya archivadas y pueden diferir del texto actual. Para citar el texto actual, utilice la URL de esta página.

Go Komura (2026). Proxy interno de la empresa y aplicaciones de Windows — Cómo se resuelve el proxy en WinINET, WinHTTP y .NET. KomuraSoft LLC. https://comcomponent.com/es/blog/windows-proxy-wininet-winhttp-dotnet/

DOI (archivo registrado)
10.5281/zenodo.22176214
DOI (última versión registrada)
10.5281/zenodo.22176215

«En el navegador puedo abrir sitios externos, pero solo la aplicación de negocio no llega a la API externa». «Si lo ejecuto a mano funciona, pero en cuanto lo convierto en servicio de Windows falla». En entornos con proxy interno, este tipo de discrepancia es habitual.

El punto de partida de la investigación es con qué cuenta y qué configuración de proxy lee esa aplicación. La configuración de proxy de Windows no es una sola. El navegador, un servicio y el HttpClient de .NET pueden estar consultando configuraciones distintas.

En la mayoría de los casos la causa no es un fallo del servidor proxy ni un error de la aplicación, sino esta discrepancia entre sistemas de configuración y cuenta de ejecución. Este artículo se dirige al personal de sistemas de pequeñas y medianas empresas y a desarrolladores de aplicaciones Windows, y ordena el panorama de la configuración, luego PAC, autenticación y certificados, y por último el procedimiento de aislamiento.

Lo que falla o lo que se quiere saber Dónde empezar a leer
Solo el navegador comunica / la configuración no cambia el comportamiento Los tres sistemas de configuración
Funciona a mano, pero falla como servicio Diferencia de cuenta de ejecución
Solo fallan URL concretas / no se usa la configuración PAC PAC y WPAD
El comportamiento cambió al pasar de .NET Framework a .NET Orden de resolución en .NET
Se devuelve 407 Autenticación de proxy
Aparecen errores de certificado Inspección TLS
No se sabe por dónde empezar Aislamiento en 5 pasos

Los patrones de creación de HttpClient y el diseño de tiempos de espera en sí se tratan en «No hay que envolver HttpClient en un using». El centro de este artículo es desde qué configuración se resuelve el proxy y dónde se detiene después la comunicación.

1. Primero la conclusión

Lo que conviene fijar primero son estos tres puntos.

  • Antes de mirar la configuración, identifique la aplicación y la cuenta de ejecución. Cuál de la configuración por usuario de WinINET, la configuración de máquina de WinHTTP y las variables de entorno se lee lo decide el lado de la aplicación. La configuración que el administrador ve en su propia pantalla no tiene por qué ser visible desde un servicio.123
  • Investigue con la URL que falla, no con una que funciona. El PAC devuelve un proxy o DIRECT según la URL. En .NET también cambia la ruta con el runtime, las variables de entorno y una especificación explícita en el controlador.456
  • Investigue por separado la ruta, la autenticación y los certificados. El 407 es autenticación de proxy y es distinto de un 401 del destino. Un error de certificado por inspección TLS se trata distribuyendo la CA interna y configurando las exclusiones necesarias, no desactivando la validación.783
Información que hay que alinear en una investigación de proxyIdentificar la pila HTTP y la cuenta de ejecución de la aplicación, alinear la configuración visible desde esa cuenta y la URL que falla, y luego investigar la ruta, la autenticación y los certificadosPila HTTP y cuentaComprobar la configuración de esa cuentaComprobar la ruta con la URL que fallaInvestigar también autenticación y certificados por separado

Figura 1: Alinee «qué configuración», «vista desde qué cuenta» y «qué URL» antes de investigar el punto de fallo.

En una frase: cuando diga «he comprobado la configuración de proxy», debe poder indicar siempre cuál de los tres sistemas comprobó y desde qué cuenta.

En el diagrama, una línea continua marca una relación que siempre se cumple y una línea discontinua una relación condicional (las condiciones están en la explicación de cada relación en la página de detalle). La lista completa de relaciones (19 en total, con evidencia y grado de certeza) y las definiciones de los conceptos principales están reunidas en la página de detalle del mapa de conocimiento (en japonés). Datos: JSON-LD / Turtle

2. Windows tiene tres sistemas de «configuración de proxy»

Las rutas por las que una aplicación en Windows encuentra el proxy interno se dividen a grandes rasgos en estos tres sistemas.

Sistema de configuración Ubicación o comando Ámbito Qué lo lee principalmente
(1) WinINET (Opciones de Internet) Aplicación Configuración → Red e Internet → Proxy, inetcpl.cpl Por usuario (predeterminado) Navegadores, aplicaciones de escritorio interactivas, valor predeterminado de .NET Framework
(2) WinHTTP (configuración de máquina) netsh winhttp set proxy / set advproxy Máquina Servicios de Windows, parte de los componentes del SO
(3) Variables de entorno HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / NO_PROXY Proceso (se hereda según el origen de la definición) HttpClient de .NET (Core en adelante), curl, herramientas multiplataforma como Node.js o Python

«La configuración de proxy de Windows» suele referirse a (1)

El «Proxy» que se ve en la aplicación Configuración es, históricamente, las Opciones de Internet de Internet Explorer, es decir, la configuración de WinINET. De forma predeterminada se guarda por usuario.3

(2) es el valor predeterminado a nivel de máquina para contextos como los servicios, donde «no hay un usuario con sesión iniciada». (3) procede sobre todo de la convención de herramientas de origen multiplataforma, y en Windows también la leen .NET (Core en adelante), curl y similares.5

Quién decide qué se lee no es quien configuró, sino la aplicación

El origen queda fijado por la aplicación: (1) si usa WinINET, (2) o una especificación propia si usa WinHTTP, y (3)→(1) si es .NET (Core en adelante).

Por tanto, cuando «la configuración es correcta pero no conecta», primero compruebe si la configuración que revisó y la que leyó la aplicación pertenecen al mismo sistema. Antes de recorrer los tres sistemas para ponerlos al mismo valor, es importante identificar el punto de entrada de la aplicación de destino.

También hay configuraciones por dispositivo, no por usuario

Si se habilita la Directiva de grupo «Hacer que la configuración del proxy sea por equipo (en lugar de por usuario)», (1) pasa a ámbito de máquina y se aplica la misma configuración a todos los usuarios. Con MDM (Intune y similares) se puede configurar por dispositivo con NetworkProxy CSP.3

Cambiar el ámbito de aplicación de la configuración por usuarioLa configuración de WinINET es por usuario de forma predeterminada, pero la Directiva de grupo puede cambiarla a configuración por equipo, y MDM puede configurarla por dispositivo con NetworkProxy CSPWinINET es por usuario de forma predeterminadaGPO la pasa a ámbito de equipoSe aplica la misma configuración a todos los usuariosNetworkProxy CSP de MDMSe configura por dispositivo

Figura 2: Como también hay configuraciones que cambian el ámbito de (1) a por dispositivo, lea «por usuario» como el estado predeterminado.

3. WinINET y WinHTTP — Una para aplicaciones interactivas, otra para servicios

3.1. Diferencia de funciones

WinINET y WinHTTP son ambas pilas de cliente HTTP estándar de Windows. Sin embargo, el modelo de ejecución que presuponen es distinto.

WinINET está pensada para aplicaciones de escritorio interactivas. Hereda de forma automática las Opciones de Internet del usuario, el proxy, las cookies y la caché de credenciales, y puede mostrar una interfaz de entrada de credenciales si hace falta. En cambio, no se admite su uso en servicios ni en procesos de tipo servicio.1

WinHTTP está pensada para servicios y para el lado del servidor. Admite la ejecución con una cuenta de servicio, la suplantación de subprocesos (impersonation) y la separación de sesiones. A cambio, no comparte la configuración, las cookies ni las credenciales del navegador, y no muestra interfaz.2

La orientación de Microsoft para elegir entre ellas es igualmente WinINET salvo que se trate de un servicio o de un proceso de tipo servicio que necesite separación de sesiones o suplantación, y WinHTTP si es un servicio.1 Esto no significa, sin embargo, que toda aplicación que se ejecute como servicio lea la configuración de máquina de WinHTTP. El trato de los servicios escritos en .NET se separa en el apartado 3.3.

3.2. Operaciones básicas de netsh winhttp

El proxy predeterminado de máquina de WinHTTP se gestiona con netsh.9

:: Mostrar la configuración de proxy de WinHTTP actual
netsh winhttp show proxy

:: Configurar un proxy estático (con lista de omisión)
netsh winhttp set proxy proxy-server="proxy.example.co.jp:8080" bypass-list="*.example.co.jp;<local>"

:: Incorporar la configuración de Opciones de Internet (WinINET)
netsh winhttp import proxy source=ie

:: Volver al valor predeterminado (DIRECT)
netsh winhttp reset proxy

No confunda configuración estática, incorporación y configuración automática

set proxy es una configuración estática. No trata la detección automática, la especificación de una URL PAC ni la autenticación de proxy.3

import proxy source=ie copia la configuración estática tal como está en el momento de ejecutarlo. Si después se cambian las Opciones de Internet, el lado de WinHTTP no las sigue.

La incorporación de la configuración de proxy es una copia de una sola vezimport proxy source=ie solo copia en WinHTTP la configuración estática de ese momento, y los cambios posteriores de Opciones de Internet no se siguen de forma automáticaConfiguración estática en el momento de la ejecuciónimport proxy source=ieCopia en WinHTTPLos cambios posteriores no se siguen de forma automática

Figura 3: import no es una configuración de sincronización, sino una operación que incorpora la configuración estática de ese momento.

Para configurar a nivel de máquina incluyendo PAC y la detección automática de WPAD, use netsh winhttp set advproxy. La configuración detallada en formato JSON incluye Proxy, ProxyBypass, AutoconfigUrl y AutoDetect.9

3.3. El escollo más frecuente: el servicio no lee la configuración de IE del usuario

El caso típico es el de un desarrollador que pasa a un servicio de Windows con LocalSystem una herramienta que ejecutaba en su propio PC.

Aunque durante el desarrollo comunicara con su propia configuración por usuario (1), la configuración visible desde LocalSystem es otra. Si la configuración de máquina de WinHTTP está sin configurar (DIRECT), intenta conectar en directo a la API externa y se agota el tiempo de espera. El procedimiento de convertir algo en servicio se trata en «Cómo crear y operar servicios de Windows».

La discrepancia al convertir en servicio una herramienta ejecutada a manoSi una herramienta que funcionaba con la configuración por usuario del desarrollador se convierte en un servicio LocalSystem, la configuración visible cambia, y si el valor predeterminado de WinHTTP es DIRECT intenta una conexión directa y fallaEjecución manual como desarrolladorComunica con la propia configuraciónCambio a servicio LocalSystemCambia la configuración visibleConexión directa si WinHTTP no está configuradoTiempo de espera agotado en la API externa

Figura 4: Aunque la máquina sea la misma, al cambiar la cuenta de ejecución cambia la configuración que se puede consultar.

Prepare la configuración en la forma que lee esa pila HTTP

Para un proceso que comunica aunque no haya un usuario con sesión iniciada, prepare configuración a nivel de máquina. El modo de configurarla, sin embargo, debe coincidir con la pila HTTP.

Destino Cómo preparar la configuración
Aplicaciones nativas y componentes de Windows que usan WinHTTP Prepare la configuración de WinHTTP con netsh3
Servicios que usan HttpClient de .NET (Core en adelante) Variables de entorno del sistema (HTTPS_PROXY y similares), o una especificación explícita de HttpClientHandler.Proxy desde la configuración de la aplicación

El HttpClient de .NET (Core en adelante) no lee la configuración de máquina de WinHTTP. No concluya que «como es un servicio, basta con configurar netsh». El orden de prioridad detallado se confirma en el capítulo 5.

Una configuración estática en un portátil que sale de la oficina también provoca el accidente inverso

Si fija el proxy estático interno en un portátil, fuera de la oficina ese proxy no es alcanzable y la comunicación deja de funcionar. Considere la configuración estática de máquina como un medio para servidores cuya configuración de red no cambia.3

4. PAC y WPAD — En qué consiste la «configuración automática»

PAC calcula la ruta; WPAD busca dónde está el PAC. Si se divide la «configuración automática» en estas dos, se ve qué hay que comprobar.

4.1. El archivo PAC y FindProxyForURL

PAC (Proxy Auto-Configuration) es un archivo escrito en JavaScript (ECMAScript). La función obligatoria FindProxyForURL(url, host) devuelve, para la URL y el host indicados, la lista de proxies que usar o DIRECT, que indica conexión directa.10

function FindProxyForURL(url, host) {
    // El dominio interno y las direcciones privadas conectan en directo
    if (dnsDomainIs(host, ".example.co.jp") ||
        isInNet(host, "10.0.0.0", "255.0.0.0")) {
        return "DIRECT";
    }
    // El resto pasa por el proxy. Si el primero no está disponible, se pasa al siguiente
    return "PROXY proxy1.example.co.jp:8080; PROXY proxy2.example.co.jp:8080; DIRECT";
}

En este ejemplo, el dominio interno y las direcciones privadas indicadas conectan en directo, y el resto pasa por el proxy. En este último caso, si el primer proxy no está disponible se pasa al siguiente y, al final, se recurre a DIRECT.

PAC cambia la ruta según el destinoEn el ejemplo de PAC descrito se evalúan la URL y el host, se devuelve DIRECT para el dominio interno y las direcciones privadas indicadas, y en caso contrario se devuelve una lista ordenada de proxiesSíNoPasar la URL y el host¿Coincide con las condiciones internas del ejemplo?Devolver DIRECTProxy 1, proxy 2 y luego DIRECT

Figura 5: Como la respuesta del PAC cambia por URL, el éxito en otro sitio no confirma la ruta de la API que falla.

De aquí salen dos precauciones para la investigación.

Compruebe pasando la URL que falla. El PAC puede devolver una respuesta distinta por cada URL. La función de proxy automático de WinHTTP también está diseñada para consultar cada vez con la URL de la solicitud. «En el navegador se ven otros sitios» no es prueba de que la API que falla tome la misma ruta.4

Si la comunicación no está en el registro del proxy, sospeche también DIRECT y las omisiones. DIRECT es la instrucción de «ir sin usar el proxy». Si la comunicación dirigida al interior no aparece en el registro, compruebe un resultado DIRECT del PAC o una coincidencia con la lista de omisión.

4.2. Detección automática con WPAD

Si se activa «Detectar la configuración automáticamente», WPAD (Web Proxy Auto-Discovery) busca el lugar del archivo PAC. En general se reparte la URL PAC por DHCP, o se resuelve por DNS un host llamado wpad y se obtiene el archivo de una URL como http://wpad/wpad.dat.11

De la detección automática a la obtención del PACEn WPAD se busca el lugar del archivo PAC mediante DHCP o DNS, se obtiene el PAC de ese lugar y se usa para calcular las rutasActivar la detección automáticaBuscar el lugar con DHCP o DNSObtener el archivo PACCalcular la ruta por destinoSi no hay mecanismo, la detección falla

Figura 6: La detección automática necesita el mecanismo de DHCP/DNS en el lado de la red.

Activar solo la detección automática en una red sin ese mecanismo no funciona, y aumenta el tiempo de espera hasta que la detección falla. Elegir «automático» no resuelve las cosas en todas partes.

4.3. Comportamiento de los clientes que no pueden leer un PAC

Aunque se distribuya un PAC, no todos los clientes lo evalúan. netsh winhttp set proxy es una configuración estática, y las herramientas del estilo de la variable de entorno HTTP_PROXY tampoco tienen, por lo general, un lugar donde escribir una URL PAC. Se especifica una URL de proxy fija.35

En una aplicación nativa que usa WinHTTP de forma directa, compruebe cómo se abre la sesión.

Uso de WinHttpOpen Tratamiento del proxy automático
En Windows 8.1 o posterior, especificar WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY WinHTTP resuelve el proxy de forma automática en cada solicitud a partir de la configuración del sistema/usuario (incluido WPAD/PAC)12
Especificar el tradicional WINHTTP_ACCESS_TYPE_DEFAULT_PROXY u otros La propia aplicación debe llamar a WinHttpGetProxyForUrl y aplicar el resultado a la solicitud. DEFAULT_PROXY está en desuso en 8.1 y posteriores1012
Comprobar si WinHTTP usa el PACSi la sesión de WinHTTP se abre con AUTOMATIC_PROXY se resuelve de forma automática, pero con la forma tradicional de abrirla la aplicación debe llamar a la API AutoProxy y aplicar el resultadoSíForma tradicional de abrirComprobar los parámetros de WinHttpOpen¿AUTOMATIC_PROXY?WinHTTP resuelve de forma automáticaLa aplicación llama a la API AutoProxyAplicar el resultado a la solicitud

Figura 7: Saber solo que una aplicación usa WinHTTP no permite concluir que el PAC también se use de forma automática.

En implementaciones antiguas, puede haber un PAC y aun así no usarse. En una red operada con PAC, decida también qué entregar, con configuración estática o variables de entorno, a los clientes que no pueden leer el PAC.

5. Resolución de proxy en .NET — Framework y Core en adelante son cosas distintas

.NET Framework y .NET (Core en adelante) determinan el proxy predeterminado de forma distinta. Investigar una aplicación .NET 8 con conocimientos de la era Framework puede llevar a comprobar la configuración equivocada.

5.1. .NET Framework — De forma predeterminada Opciones de Internet, sobrescrito con defaultProxy

HttpWebRequest de .NET Framework, y el HttpClient que se apoya en él, usan el proxy predeterminado salvo que se especifique Proxy de forma explícita. Ese valor predeterminado se determina combinando la configuración de Internet de la cuenta en ejecución (equivalente a WinINET) con el archivo de configuración, y la configuración del archivo de configuración tiene prioridad.6

Se controla con system.net/defaultProxy de app.config o machine.config.13

<configuration>
  <system.net>
    <!-- useDefaultCredentials: si se envían las credenciales predeterminadas al proxy con autenticación -->
    <defaultProxy enabled="true" useDefaultCredentials="true">
      <proxy usesystemdefault="true"
             proxyaddress="http://proxy.example.co.jp:8080"
             bypassonlocal="true" />
      <bypasslist>
        <add address="[a-z]+\.example\.co\.jp$" />
      </bypasslist>
    </defaultProxy>
  </system.net>
</configuration>

Si defaultProxy está vacío se usan las Opciones de Internet; si se escriben proxyaddress y similares, esa especificación tiene prioridad. Desde el programa se puede sustituir el mismo valor predeterminado con WebRequest.DefaultWebProxy.136

El proxy predeterminado de .NET FrameworkEn .NET Framework se parte de la configuración de Internet de la cuenta en ejecución y se da prioridad a los valores especificados en el archivo de configuración para determinar el proxy predeterminadoConfiguración de la cuenta de ejecuciónPrioridad a lo especificado en el archivo de configuraciónProxy predeterminado de FrameworkSustitución con DefaultWebProxy

Figura 8: El valor predeterminado de Framework es la configuración de la «cuenta en ejecución», que no tiene por qué ser la visible en la pantalla del administrador.

Al ejecutarlo con una cuenta de servicio hace falta la misma precaución que en el apartado 3.3. Lo que lee de forma predeterminada son las Opciones de Internet de esa cuenta, distintas de lo que se ve en el escritorio del administrador y, por lo general, vacías.

5.2. .NET (Core en adelante) — Primero las variables de entorno, después la configuración de usuario del SO

.NET (Core en adelante) tiene la propiedad estática HttpClient.DefaultProxy. Es el valor predeterminado que se usa cuando el controlador no especifica un proxy de forma explícita, y en Windows se inicializa leyendo las variables de entorno y, si no están definidas, la configuración de proxy del usuario, en ese orden.5

Variable de entorno Significado
HTTP_PROXY Proxy usado para solicitudes HTTP
HTTPS_PROXY Proxy usado para solicitudes HTTPS
ALL_PROXY Recurso si las anteriores no están definidas
NO_PROXY Lista separada por comas de hosts para los que no se usa proxy

Separe las tres variables que especifican el proxy de NO_PROXY

Si está definida cualquiera de HTTP_PROXY, HTTPS_PROXY o ALL_PROXY, tiene prioridad sobre la configuración del SO. Un HTTPS_PROXY de prueba que quedó atrás, o uno inyectado por una plantilla de CI/CD, envía el tráfico por una ruta distinta de la configuración que se vio en pantalla.

En cambio, definir solo NO_PROXY no configura un proxy a partir de las variables de entorno. En Windows se sigue usando la configuración de proxy de usuario del SO.

Inicialización del proxy predeterminado de .NET en WindowsSi está definida cualquiera de HTTP_PROXY, HTTPS_PROXY y ALL_PROXY se priorizan las variables de entorno, y si no está definida ninguna se usa la configuración de usuario de Windows. Solo NO_PROXY no configura un proxy por variables de entornoSíNoInicialización del proxy predeterminado¿Hay alguna de las 3 variables de proxy?Prioridad a las variables de entornoConfiguración de usuario de WindowsSolo NO_PROXY no configura nada

Figura 9: Compruebe primero si hay una especificación de proxy por variables de entorno, y distíngala del estado con solo NO_PROXY.

El «punto inicial» de NO_PROXY y la diferencia en Linux

NO_PROXY no admite comodines (*). .example.com con un punto al inicio coincide con www.example.com, pero no con example.com en sí.5

En contenedores Linux y similares, si las variables de entorno no están definidas se inicializa sin proxy. Como el comportamiento predeterminado cambia entre Windows y Linux, compruébelo también al pasar a un contenedor.5

5.3. Especificación explícita — HttpClientHandler.Proxy y UseProxy

En ambos runtimes, la especificación explícita de HttpClientHandler.Proxy tiene la máxima prioridad. Tiene prioridad sobre la configuración del SO y el archivo de configuración. Con UseProxy = false no se usa proxy en absoluto.11

using System.Net;

// Usar de forma explícita un proxy leído de la configuración de la aplicación
var handler = new HttpClientHandler
{
    Proxy = new WebProxy("http://proxy.example.co.jp:8080")
    {
        BypassProxyOnLocal = true,
        BypassList = new[] { @"^intra\.example\.co\.jp$" },
        UseDefaultCredentials = true // Si hay proxy con autenticación, responder con las credenciales de la cuenta de ejecución
    },
    UseProxy = true
};
var client = new HttpClient(handler);

// Un cliente que no usa proxy en absoluto (para conexión directa a API internas)
var directHandler = new HttpClientHandler { UseProxy = false };
var directClient = new HttpClient(directHandler);
Determinar el proxy efectivo a partir del controladorSi UseProxy es false la conexión es directa, si es true se usa la especificación explícita de Proxy en el controlador, y si no hay especificación explícita se usa el proxy predeterminadoNoSíSíNo¿UseProxy es true?Conexión directa¿Proxy especificado de forma explícita?Usar el proxy indicadoUsar el proxy predeterminado

Figura 10: Antes de investigar el proxy predeterminado, compruebe la especificación explícita del controlador y UseProxy.

Atención también a la omisión automática de destinos locales

Cuando no hay especificación explícita y se sigue la configuración del SO, los nombres planos sin punto, las direcciones de bucle invertido y los destinos que coinciden con el sufijo de dominio de la propia máquina pueden tratarse como «locales» y omitirse.11

Cuando «el comportamiento difiere entre una dirección IP directa y un nombre» o «al usar el FQDN empezó a pasar por el proxy», compruebe esta determinación.

El orden de prioridad hasta aquí se resume así.

Prioridad (alta → baja) .NET Framework .NET (Core en adelante)
1 Especificación explícita como HttpClientHandler.Proxy Igual que a la izquierda
2 defaultProxy de app.config Asignación a HttpClient.DefaultProxy
3 Opciones de Internet de la cuenta de ejecución Variables de entorno (HTTP_PROXY y similares)
4 — Configuración de proxy de usuario de Windows

6. Proxies con autenticación — El 407 es un error de autenticación «del proxy»

6.1. No confunda 407 con 401

Aunque se llegue al proxy, sin pasar la autenticación no se avanza. Separe quién exige la autenticación por el código de estado y la cabecera.7

Respuesta Quién exige la autenticación Cabecera que comprobar
407 Proxy Authentication Required El proxy Proxy-Authenticate
401 El servidor de destino WWW-Authenticate

En un 407, primero compruebe los métodos enumerados en Proxy-Authenticate. Basic es un método que envía nombre de usuario y contraseña; Negotiate (Kerberos/NTLM) y similares son métodos de desafío/respuesta. En estos últimos la contraseña en sí no circula, y la autenticación se completa en varios intercambios.7

Flujo de respuesta a un proxy con autenticaciónEl cliente recibe del proxy un 407 y la notificación del método de autenticación, y responde con las credenciales de ese método. En un método de desafío-respuesta hacen falta varios intercambiosProxyClienteProxyClienteSegún el método, varios intercambiosSolicitar la comunicación407 y Proxy-AuthenticateResponder a la autenticación según el método

Figura 11: En un 407, compruebe la información de autenticación que se envía al proxy, no al servidor de destino.

A qué método de autenticación se «cae» se trata con detalle en «NTLM y Kerberos explicados con diagramas».

6.2. Cómo pasar las credenciales en .NET

El lugar de configuración difiere entre seguir el proxy predeterminado y especificar el proxy de forma explícita.

Para usar el proxy predeterminado y pasar credenciales, use HttpClientHandler.DefaultProxyCredentials. Son las credenciales que se envían a ese proxy predeterminado cuando UseProxy = true y Proxy = null.14

using System.Net;

var handler = new HttpClientHandler
{
    UseProxy = true,   // Valor predeterminado. Combinado con Proxy nulo, se usa el proxy predeterminado del sistema
    Proxy = null,
    // Responder al 407 con las credenciales de la cuenta de ejecución (usuario con sesión o cuenta de servicio)
    DefaultProxyCredentials = CredentialCache.DefaultCredentials
};
var client = new HttpClient(handler);

Cuando se especifica el proxy de forma explícita, las credenciales se ponen en el lado de WebProxy. En la mayoría de los escenarios de cliente se recomienda usar las credenciales predeterminadas del usuario con sesión, no un nombre de usuario y una contraseña individuales, y eso es lo que hace WebProxy.UseDefaultCredentials = true.15

6.3. El problema del 407 con cuenta de servicio

Las «credenciales predeterminadas» son las credenciales de la cuenta que ejecuta ese proceso. Con un usuario interactivo se autentica como ese usuario; con un servicio LocalSystem, como cuenta de equipo.

Al convertirse en servicio cambia el sujeto que se autenticaSi se usan las credenciales predeterminadas, en una ejecución interactiva se autentica como ese usuario y en un servicio LocalSystem como cuenta de equipo, así que hay que comprobar si el proxy puede autenticar a ese sujetoUsuario interactivoLocalSystem¿Cuenta de ejecución?Credenciales de ese usuarioCuenta de equipoComprobar si el proxy puede autenticarlo

Figura 12: Aunque en el código se deje elegido «predeterminado», al convertirse en servicio cambia el sujeto que el proxy autentica.

Un proxy que autentica usuarios mediante integración con AD puede no poder autenticar una cuenta de equipo o una cuenta local, y los 407 continúan. A la inversa, hay entornos que establecen una exclusión de autenticación para servicios por IP de origen o por cuenta.

Por eso, en una aplicación que se va a convertir en servicio, decida en la fase de diseño si usar una cuenta de servicio de dominio (gMSA y similares), establecer una exclusión de autenticación en el proxy, o preparar un proxy de retransmisión interno que no requiera autenticación. La investigación de un 407 necesita tanto la configuración de la aplicación como «si el proxy puede autenticar esa cuenta de ejecución».

También existe el método de incrustar las credenciales en una variable de entorno, como en HTTP_PROXY=http://user:pass@proxy:8080.5 Como la contraseña en texto claro queda expuesta en las variables de entorno, es decir, en la información del proceso, no se recomienda para una operación permanente.

7. HTTPS y el proxy — Túnel CONNECT e inspección TLS

7.1. HTTPS atraviesa el proxy en un «túnel»

Cuando se usa un proxy con HTTPS, el cliente primero envía CONNECT host-de-destino:443 y abre un túnel TCP. Si tiene éxito, el proxy devuelve 200 y, a continuación, el cliente y el servidor de destino realizan el protocolo de enlace TLS dentro del túnel. Si el túnel no se abre, se devuelve 407, 502 u otro similar.16

Hasta que se abre el túnel HTTPSEn HTTPS se abre un túnel TCP con una solicitud CONNECT y, tras devolver 200, se realiza el protocolo de enlace TLS dentro del túnel. Si el túnel no se abre, se devuelve 407, 502 u otro similarÉxito, 200FalloIndicar el destino con CONNECT¿Se abrió el túnel?Conexión TLS dentro del túnel407, 502, etc.

Figura 13: Lea por separado el fallo en la etapa de abrir el túnel y el fallo de la conexión TLS posterior.

En este modelo «de paso transparente», el proxy no puede leer el contenido cifrado de HTTPS. Lo que se ve en el registro es solo el nombre de host de destino y si la conexión tuvo éxito; la ruta de la URL no se ve.

7.2. Proxies de inspección TLS y errores de certificado

En el modelo de inspección TLS (descifrado SSL, break and inspect), el proxy termina TLS, descifra e inspecciona, y después vuelve a cifrar. El certificado que se presenta al cliente también se sustituye por uno re-firmado por la propia CA del proxy.8

La inspección TLS cambia el certificadoEn la inspección TLS el proxy termina TLS para inspeccionar el contenido y presenta al cliente un certificado re-firmado por su propia CA, así que hace falta confianza en esa CAEl proxy termina TLSDescifrar, inspeccionar y volver a cifrarCertificado re-firmado por la CA internaHace falta confianza en la CA en el lado del cliente

Figura 14: En el modelo de inspección, el problema no es solo el certificado del destino, sino si se puede confiar en la CA interna.

Primero, compruebe en qué almacén de confianza se valida

Esta configuración requiere que el certificado de CA del proxy esté distribuido a las raíces de confianza de todos los clientes. El error de validación de certificado se produce no solo en las máquinas a las que no se ha distribuido, sino también en runtimes que usan su propio almacén de confianza y no miran el almacén de certificados de Windows.

En .NET suele aparecer como un HttpRequestException con un AuthenticationException interno. Confirme un mensaje del tipo «el certificado remoto no es válido».

El remedio es distribuir la CA, no desactivar la validación

El certificado de la CA interna se distribuye, por lo general, a «Entidades de certificación raíz de confianza» del equipo local. Para cuándo usar el almacén de usuario, consulte «Guía práctica del almacén de certificados de Windows».

No recurra a devolver siempre true en ServerCertificateCustomValidationCallback. Sigue quedando como una vulnerabilidad que impide detectar un ataque de intermediario cuando la aplicación se usa en una red externa.

Excluya de la inspección el tráfico con anclaje de certificados

La comunicación que hace anclaje de certificados (certificate pinning) falla en el momento en que el proxy sustituye el certificado. En componentes de Windows que validan certificados concretos de Microsoft y similares no hay esta vía de escape, y hace falta una configuración de exclusión.3

Separar la distribución de la CA y la exclusión del tráfico con anclajeEn un error de certificado por inspección TLS se comprueba la confianza en la CA, pero en el tráfico con anclaje de certificados la propia sustitución es la causa del fallo, así que se excluye de la inspecciónSíNoError de validación de certificado¿Certificado anclado?Excluir de la inspecciónComprobar el almacén de confianza que se consultaComprobar la distribución de la CA interna

Figura 15: Distribuir la CA interna y evitar la propia sustitución del certificado son remedios distintos.

Microsoft también recomienda excluir el tráfico hacia SaaS como Microsoft 365 del descifrado e inspección en la capa de red.8 Si los errores de certificado aparecen solo con servicios en la nube concretos, sospeche la combinación de la lista de exclusión de la inspección y el anclaje.

8. Procedimiento de aislamiento — Identificar al culpable en 5 pasos

En una investigación real, compruebe los mecanismos vistos hasta aquí en este orden.

Paso Qué hacer Qué se averigua
(1) Reproducir Acceder a la URL que falla con curl.exe -v o Invoke-WebRequest (si es posible, en la misma máquina y con la misma cuenta) Si el problema es propio de la aplicación o del entorno
(2) Recoger la configuración Recoger los tres sistemas: netsh winhttp show proxy, la configuración por usuario y las variables de entorno Qué hay en cada sistema
(3) Identificar la cuenta Identificar la cuenta de ejecución de la aplicación de destino (si es un servicio, el Programador de tareas u otro usuario) Con qué configuración y qué credenciales se ejecuta
(4) Clasificar el error Distinguir 407 / 403 / fallo de resolución de nombres / tiempo de espera agotado / error de certificado Aislamiento entre autenticación de proxy, denegación por directiva, ruta e inspección TLS
(5) Registro del proxy Comprobar el registro de acceso del servidor proxy a la hora correspondiente Si se llegó al proxy y como quién se autenticó

(1) Reproducir: aunque la URL sea la misma, alinee también el sistema de configuración de la herramienta

Acceda a la URL que falla, si es posible desde la misma máquina y la misma cuenta. Preste atención también a las diferencias entre herramientas.

Herramienta Qué tener en cuenta en la investigación
El curl.exe incluido en Windows Se puede especificar el proxy de forma explícita con -x http://proxy:8080. Para la validación TLS suele usarse el almacén de certificados del SO (SChannel)
Invoke-WebRequest de Windows PowerShell 5.1 Resolución del lado de .NET Framework. De forma predeterminada, Opciones de Internet
Invoke-WebRequest de PowerShell 7 Resolución del lado de .NET. Prioridad a las variables de entorno

«curl pasa y la aplicación no» es una pista de que los sistemas de configuración no coinciden. El éxito con otra herramienta no basta para concluir que la aplicación tomó la misma ruta.

(2) Recoger la configuración: registrar los tres sistemas juntos

En PowerShell se pueden recoger así. El HKCU de la configuración por usuario es el de la cuenta que ejecutó este comando.

# (1) Configuración por usuario (WinINET) — atención a que lee el HKCU de la cuenta de ejecución
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' |
    Select-Object ProxyEnable, ProxyServer, ProxyOverride, AutoConfigURL

# (2) Configuración de máquina (WinHTTP)
netsh winhttp show proxy

# (3) Variables de entorno
Get-ChildItem env: | Where-Object Name -match 'proxy'

(3) Identificar la cuenta: si es un servicio, vuelva a comprobarlo con la misma cuenta

Identifique si el destino se ejecuta como servicio, desde el Programador de tareas o como otro usuario. Si es un servicio, repita la reproducción de (1) y la recogida de (2) con la misma cuenta. El éxito en la propia sesión de administrador no demuestra lo que ve LocalSystem.

Reproducir alineando la cuenta de ejecuciónComo la recogida en la sesión del administrador no demuestra la configuración visible desde el servicio, tras identificar la cuenta de ejecución de destino se vuelven a comprobar la reproducción y la recogida de configuración con esa cuentaComprobado en la sesión del administradorIdentificar la cuenta de ejecución de destinoReproducir y recoger con la misma cuentaConfrontar configuración y credenciales

Figura 16: Confirme que la información recogida en (1) y (2) es la vista desde la cuenta de destino identificada en (3).

(4) Clasificar el error: descomponer «no conecta»

Si es 407, compruebe la autenticación de proxy del capítulo 6; si es un error de certificado, la inspección TLS del capítulo 7. Si se agota el tiempo de espera, tome como primer candidato que no se está llegando al proxy, e investigue la ruta, la resolución de nombres y el firewall. Una denegación por directiva 403 también se separa de la autenticación y del tiempo de espera.

Separar el destino de la investigación a partir del errorDividir el fallo de comunicación en 407, 403, tiempo de espera o fallo de resolución de nombres, y error de certificado, e investigar respectivamente autenticación, denegación por directiva, ruta e inspección TLSFallo de comunicaciónSi es 407, autenticación de proxySi es 403, denegación por directivaSi es tiempo de espera o resolución de nombres, la rutaSi es error de certificado, TLS

Figura 17: Al separar por código de estado y excepción, se acotan la configuración y los registros que hay que comprobar.

El patrón en el que la causa es una regla de entrada del Firewall de Windows, y no el proxy, se trata en «El Firewall de Windows y las aplicaciones de negocio».

(5) Registro del proxy: confirmar la llegada y la cuenta autenticada

En el registro de acceso de la hora correspondiente, confirme si se llegó al proxy y como quién se autenticó. Si no hay rastro, trate la comunicación como que no llegó al proxy, e investigue un DIRECT del PAC, la lista de omisión y variables de entorno que quedaron olvidadas.

Si hace falta, confirme el destino real con una captura de paquetes. El método de captura está en «Captura de paquetes en Windows en la práctica — Cómo elegir entre pktmon, netsh trace y Wireshark».

9. Recomendaciones de diseño — Hacer del proxy una «aplicación configurable»

La facilidad de investigación cambia con los elementos de configuración y los registros de la aplicación. En una aplicación que se entrega a un entorno con proxy interno, prepare estos cuatro puntos.

No solo seguir el valor predeterminado: poder elegir también especificación explícita y conexión directa

Deje como valor predeterminado «seguir la configuración del SO» y, para los casos en que no se puede leer el PAC, se ejecuta como servicio o la configuración es especial, permita especificar desde un archivo de configuración la URL del proxy, la lista de omisión y «no usar proxy». Los puntos de implementación son HttpClientHandler.Proxy y UseProxy del apartado 5.3.11

El valor predeterminado de .NET (Core en adelante) también incluye la prioridad de las variables de entorno explicada en el apartado 5.2. Aunque se deje al valor predeterminado, lea qué configuración se usa según esas reglas.

Deje las excepciones internas en una forma que quepa en la guía de implantación

Deje por escrito con cuál de DIRECT del PAC, la lista de omisión y NO_PROXY se excluye la comunicación interna hacia API, bases de datos, servidores de licencias y similares. Muestre, con ejemplos, que NO_PROXY no admite comodines y el significado del punto inicial.5

Diseñe también los tiempos de espera y los reintentos presuponiendo el paso por el proxy

Si se espera un tiempo de espera predeterminado largo ante una parada del proxy o una espera de autenticación, se congelan tanto la interfaz como la operación. Separe un tiempo de espera de conexión más corto y limite los reintentos a solicitudes idempotentes. Los detalles se tratan en «No hay que envolver HttpClient en un using».

Deje en el registro la ruta a partir del controlador realmente configurado

Si solo se registra HttpClient.DefaultProxy, se pasan por alto la especificación explícita del controlador y UseProxy = false, y se registra una ruta que no coincide. Es importante elegir la configuración efectiva a partir del controlador usado para crear el HttpClient, y reflejar también la determinación de omisión del destino.

using System.Net.Http;

// handler es la misma instancia usada para crear el HttpClient
// UseProxy=false siempre es conexión directa. Si hay especificación explícita se usa esa; si no, DefaultProxy
var effectiveProxy = handler.UseProxy
    ? handler.Proxy ?? HttpClient.DefaultProxy
    : null;
var target = new Uri("https://api.example.com/v1/orders");
var route = effectiveProxy is null || effectiveProxy.IsBypassed(target)
    ? "DIRECT"
    : effectiveProxy.GetProxy(target)?.ToString() ?? "DIRECT";
logger.LogInformation("Envío HTTP {Target} ruta {Route} cuenta de ejecución {User}",
    target, route, Environment.UserName);
Registrar la ruta a partir de la configuración del cliente de comunicaciónElegir el proxy efectivo a partir del controlador usado para crear el HttpClient, realizar la determinación de omisión del destino y la resolución del proxy, y registrar la ruta y la cuenta de ejecuciónEl mismo controlador que en la creaciónReflejar UseProxy y la especificación explícitaDeterminación de omisión y resolución del destinoRegistrar la ruta y la cuenta

Figura 18: Registre la ruta a partir de la configuración del propio cliente, no solo del proxy predeterminado.

Si al iniciar se registran la ruta hacia los destinos principales y la cuenta de ejecución, resulta más fácil seguir los pasos (1) a (3) del capítulo 8. Cuando le digan «pero en el navegador sí conecta», un diseño resistente a la investigación es aquel en el que la aplicación puede explicar su propia configuración y su ruta.

10. Resumen

En una investigación de proxy de Windows, primero alinee el sistema de configuración, la cuenta de ejecución y la URL de destino.

La configuración por usuario de WinINET, la configuración de máquina de WinHTTP y las variables de entorno son sistemas distintos. Al convertirse en servicio cambian la configuración visible y las credenciales, y el orden predeterminado también difiere entre .NET Framework y .NET (Core en adelante). netsh winhttp set proxy por sí solo no trata PAC, detección automática ni autenticación.

El PAC devuelve un proxy o DIRECT por URL, y WPAD necesita el mecanismo en el lado de la red. Aunque la ruta ya esté decidida, la autenticación de proxy del 407 y la validación de certificados por inspección TLS se comprueban por separado. No desactive la validación de certificados; distribuya la CA y excluya el tráfico con anclaje.

El aislamiento sigue el orden reproducir → recoger los tres sistemas de configuración → identificar la cuenta de ejecución → clasificar el error → registro del proxy. En el lado de la aplicación, prepare especificación explícita del proxy y conexión directa, configuración de excepciones, tiempos de espera y registro de la ruta.

La próxima vez que le consulten «solo la aplicación de negocio no conecta», empiece por confirmar esto.

Esa aplicación, ¿con la cuenta de quién se ejecuta y cuál de los tres sistemas de configuración de proxy lee?

Esa sola pregunta es la entrada a la investigación.

Artículos relacionados

Ámbitos de consulta relacionados

En KomuraSoft LLC tratamos la investigación de fallos de comunicación de aplicaciones Windows en entornos con proxy interno, proxy con autenticación e inspección TLS, como «en el equipo de desarrollo funciona, pero en la red del cliente no comunica» o «al convertirlo en servicio dejó de alcanzar la API externa», y también la consulta sobre el diseño de comunicación de aplicaciones de negocio que presuponen un entorno de proxy (elementos de configuración, tiempos de espera y diseño de registros). Basta con empezar por ordenar el procedimiento de reproducción y el método de recogida de registros.

Referencias

  1. Microsoft Learn, WinINet vs. WinHTTP. Sobre la orientación de usar WinINET salvo que el proceso sea un servicio o necesite suplantación o separación de sesiones, y la tabla comparativa de funciones que cubre la caché de credenciales, el mensaje de credenciales, la compatibilidad con servicios, la suplantación, la separación de sesiones y más. ↩ ↩2 ↩3

  2. Microsoft Learn, About WinHTTP. Sobre que WinHTTP es una pila HTTP diseñada para servicios y usos de servidor, que admite la ejecución con una cuenta de servicio y la suplantación, y que no comparte las cookies, la caché, las credenciales ni las Opciones de Internet del usuario del navegador. ↩ ↩2

  3. Microsoft Learn, Using a proxy with Delivery Optimization. Sobre que netsh winhttp set proxy es una configuración estática que no admite detección automática, URL PAC ni autenticación de proxy, la configuración de proxy por dispositivo para contextos sin usuario con sesión (NetworkProxy CSP y la directiva «Hacer que la configuración del proxy sea por equipo»), y que el tráfico que usa anclaje de certificados falla con inspección TLS y requiere exclusión. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  4. Microsoft Learn, WinHttpGetProxyForUrl function. Sobre que, como implementación del protocolo WPAD, hay que llamarla por URL porque el archivo PAC puede devolver un proxy distinto según la URL, y que admite tanto la especificación explícita de la URL PAC como la detección automática desde la red. ↩ ↩2

  5. Microsoft Learn, HttpClient.DefaultProxy Property. Sobre que en Windows se leen primero las variables de entorno HTTP_PROXY, HTTPS_PROXY, ALL_PROXY y NO_PROXY, y si no están definidas se lee la configuración de proxy del usuario; que en Linux se inicializa sin proxy si no hay variables de entorno; que NO_PROXY no admite comodines y usa la coincidencia de subdominio con punto inicial; y que la URL del proxy puede incluir nombre de usuario y contraseña. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  6. Microsoft Learn, Configuring Internet Applications. Sobre que en .NET Framework el elemento defaultProxy define el proxy predeterminado, que un HttpWebRequest sin propiedad Proxy usa el proxy predeterminado, y que la configuración de Internet del sistema se combina con la del archivo de configuración, con prioridad para el archivo de configuración. ↩ ↩2 ↩3

  7. Microsoft Learn, Authentication in WinHTTP. Sobre que cuando hace falta autenticación de proxy se devuelven el código de estado 407 y la cabecera Proxy-Authenticate (la autenticación del servidor usa 401 y WWW-Authenticate), la diferencia entre la autenticación Basic y los métodos de desafío/respuesta como Kerberos, y que en los métodos de desafío/respuesta el nombre de usuario y la contraseña no circulan por la red. ↩ ↩2 ↩3

  8. Microsoft Learn, Understanding implications when using network intermediation to decrypt or manipulate Microsoft 365 traffic at the network layer. Sobre que la inspección TLS (descifrado SSL) es una configuración en la que un proxy o un firewall descifra, inspecciona y vuelve a cifrar TLS, que puede provocar fallos de función y degradación del rendimiento en servicios que presuponen TLS de extremo a extremo, y la recomendación de excluir el tráfico hacia Microsoft 365 del descifrado e inspección en la capa de red. ↩ ↩2 ↩3

  9. Microsoft Learn, netsh winhttp. Sobre la sintaxis de netsh winhttp show/set/import/reset, proxy-server y bypass-list de set proxy, import proxy source=ie, y la configuración detallada de proxy en formato JSON (Proxy, ProxyBypass, AutoconfigUrl, AutoDetect) de set advproxy. ↩ ↩2

  10. Microsoft Learn, WinHTTP AutoProxy Support. Sobre que el script PAC incluye la función FindProxyForURL(url, host) y calcula una lista de proxies por solicitud, que un valor de retorno especial indica que basta una conexión directa, y que en la API AutoProxy tradicional el proxy automático no está integrado de forma automática en la pila HTTP, de modo que la aplicación debe llamar a WinHttpGetProxyForUrl. ↩ ↩2

  11. Microsoft Learn, Make HTTP requests with the HttpClient class. Sobre los dos métodos de configuración HttpClient.DefaultProxy y HttpClientHandler.Proxy, que una especificación de Proxy tiene prioridad sobre el archivo de configuración y la configuración del equipo local, la configuración habitual de WPAD en la que el archivo PAC (wpad.dat y similares) se obtiene mediante el nombre DNS wpad o DHCP, y la determinación de omisión de destinos locales por nombres planos, bucle invertido y coincidencia de sufijo de dominio. ↩ ↩2 ↩3 ↩4

  12. Microsoft Learn, WinHttpOpen function. Sobre el significado de cada valor de dwAccessType. WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY (Windows 8.1 y posteriores) determina el proxy de forma automática a partir de la configuración de proxy del sistema/usuario y también trata de forma automática la conmutación por error y la autenticación, y WINHTTP_ACCESS_TYPE_DEFAULT_PROXY está en desuso en 8.1 y posteriores. ↩ ↩2

  13. Microsoft Learn, defaultProxy element (network settings). Sobre los atributos enabled y useDefaultCredentials del elemento system.net/defaultProxy, los elementos secundarios proxy, bypasslist y module, que si el elemento está vacío se usa la configuración de proxy del sistema, y que al migrar a .NET 6 o posterior se configura con HttpClient.DefaultProxy. ↩ ↩2

  14. Microsoft Learn, HttpClientHandler.DefaultProxyCredentials Property. Sobre que es la propiedad que establece las credenciales usadas para autenticarse ante el proxy predeterminado del sistema cuando UseProxy es true y Proxy es null. ↩

  15. Microsoft Learn, WebProxy.Credentials Property. Sobre que la propiedad Credentials son las credenciales que se envían al proxy como respuesta a HTTP 407, y que en la mayoría de los escenarios de cliente se recomienda establecer UseDefaultCredentials en true para usar las credenciales predeterminadas del usuario con sesión. ↩

  16. Microsoft Learn, Work with existing on-premises proxy servers. Sobre que la comunicación HTTPS de salida se establece con una solicitud CONNECT al proxy, que si tiene éxito se devuelve HTTP 200, y que respuestas como 407 (exigencia de autenticación) o 502 indican que el proxy no está permitiendo la comunicación, de modo que el aislamiento debe continuar con el equipo del proxy. ↩

Artículos recientes con las mismas etiquetas para profundizar en temas cercanos.

Estas páginas sitúan el tema en un contexto más amplio de servicios y decisiones.

El artículo está directamente relacionado con los siguientes servicios.

Preguntas frecuentes

Preguntas habituales en las consultas sobre el tema del artículo.

El navegador conecta, pero solo la aplicación de negocio no puede atravesar el proxy interno. ¿Por qué?
El navegador lee la configuración de proxy por usuario de WinINET, pero la aplicación de negocio no necesariamente lee la misma configuración. Una aplicación que se ejecuta como servicio de Windows o con otra cuenta consulta la configuración visible desde esa cuenta, la configuración de máquina de WinHTTP o las variables de entorno. Primero identifique la cuenta de ejecución y compruebe la configuración de proxy visible desde esa cuenta tanto con netsh winhttp show proxy como en la configuración de usuario. Si puede reproducir el problema con curl.exe u otra herramienta usando la misma cuenta y la misma máquina, se trata de una discrepancia entre sistemas de configuración y no de un problema propio de la aplicación.
Configuré netsh winhttp set proxy, pero la comunicación de la aplicación no cambia. ¿Por qué?
netsh winhttp configura el valor predeterminado de máquina de WinHTTP, y no afecta a los navegadores ni a las aplicaciones interactivas que leen WinINET, ni al HttpClient de .NET (Core en adelante), que prioriza las variables de entorno. Además, netsh winhttp set proxy es una configuración estática que no trata la configuración automática mediante PAC, la detección automática ni la autenticación de proxy. Primero hay que confirmar con qué pila HTTP trabaja la aplicación en cuestión y de qué sistema de configuración resuelve el proxy.
¿Qué configuración de proxy leen las aplicaciones .NET?
.NET Framework usa de forma predeterminada la configuración de Opciones de Internet (equivalente a WinINET) de la cuenta en ejecución, y se puede sobrescribir con el elemento system.net/defaultProxy de app.config. El HttpClient de .NET (Core en adelante) lee primero variables de entorno como HTTP_PROXY, HTTPS_PROXY y NO_PROXY, y si no están definidas recurre a la configuración de proxy de usuario de Windows. En ambos casos, si se especifica de forma explícita con HttpClientHandler.Proxy, esa especificación tiene la máxima prioridad. Es decir, el orden de resolución predeterminado difiere entre Framework y Core en adelante, por lo que al migrar conviene volver a comprobar el comportamiento del proxy.
¿Qué se debe comprobar cuando aparece 407 Proxy Authentication Required?
El 407 es una señal de que el propio proxy exige autenticación, algo distinto de un error de autenticación del servidor de destino (401). Primero confirme, mediante la cabecera Proxy-Authenticate, qué método de autenticación exige el proxy (Negotiate, NTLM, Basic), y en .NET pase las credenciales con HttpClientHandler.DefaultProxyCredentials o WebProxy.UseDefaultCredentials. En aplicaciones que se ejecutan con una cuenta de servicio, las «credenciales predeterminadas» pasan a ser las de esa cuenta de servicio, por lo que es típico que algo funcione con un usuario interactivo pero devuelva 407 en cuanto se convierte en servicio. Compruebe también, en los registros del propio proxy, con qué identidad se autenticó.
Con un proxy de inspección TLS obtengo errores de certificado. ¿Puedo desactivar la validación de certificados?
No se recomienda desactivarla. Un proxy de inspección TLS descifra la comunicación y presenta al cliente un certificado re-firmado por su propia CA, de modo que si esa CA no está en las entidades de confianza, se produce un error de validación. La solución correcta es distribuir el certificado de la CA interna al almacén de certificados de Windows (normalmente Entidades de certificación raíz de confianza del equipo local). Desactivar la validación en el código impide detectar ataques de intermediario cuando la aplicación se usa fuera de la red de la empresa, y deja una vulnerabilidad permanente.

Perfil del autor

Página de presentación del autor del artículo.

Go Komura

Representante de KomuraSoft LLC

Especializado en desarrollo de software para Windows, consultoría técnica e investigación de fallos, sobre todo en proyectos con sistemas existentes y errores difíciles de reproducir.

Volver al blog