Proxy d'entreprise et applications Windows — démêler la résolution de proxy dans WinINET, WinHTTP et .NET

· Mis à jour le: · · Windows, Proxy, WinHTTP, WinINET, .NET, HttpClient, PAC, WPAD, Réseau

Historique des révisions (première version, publiée le 20 Aug 2026)
Première publication
Citer cet article(DOI (archive enregistrée): 10.5281/zenodo.22176216)

Les DOI ci-dessous renvoient à des versions déjà archivées et peuvent différer du texte actuel. Pour citer le texte actuel, utilisez l’URL de cette page.

Go Komura (2026). Proxy d'entreprise et applications Windows — démêler la résolution de proxy dans WinINET, WinHTTP et .NET. KomuraSoft LLC. https://comcomponent.com/fr/blog/windows-proxy-wininet-winhttp-dotnet/

DOI (archive enregistrée)
10.5281/zenodo.22176216
DOI (dernière version enregistrée)
10.5281/zenodo.22176217

« Le navigateur ouvre les sites externes, mais seule l’application métier n’atteint pas l’API externe. » « Cela communique quand je l’exécute à la main, et échoue dès que j’en fais un service Windows. » Dans un environnement avec un proxy d’entreprise, ce type de décalage est fréquent.

Le point de départ de l’enquête est quels réglages de proxy cette application lit, et sous le compte de qui. Windows n’a pas un seul réglage de proxy. Le navigateur, un service et HttpClient de .NET peuvent chacun consulter des réglages différents.

Dans la plupart des cas, la cause n’est ni une panne du serveur proxy, ni un bogue de l’application, mais ce décalage entre familles de configuration et comptes d’exécution. Cet article s’adresse au personnel informatique des PME et aux développeurs d’applications Windows. Il parcourt d’abord le tableau d’ensemble des réglages, puis PAC, l’authentification et les certificats, et enfin la procédure d’isolement.

Ce qui pose problème, ou ce que vous voulez savoir Par où commencer
Seul le navigateur communique / le comportement ne change pas après configuration Les trois familles de réglages
Cela marche à la main, mais échoue en service Différences de compte d’exécution
Seules certaines URL échouent / les réglages PAC ne sont pas utilisés PAC et WPAD
Le comportement a changé après le passage de .NET Framework à .NET Ordre de résolution .NET
Un 407 est renvoyé Authentification proxy
Des erreurs de certificat apparaissent Inspection TLS
Vous ne savez pas par où commencer Isolement en cinq étapes

Les modèles de création de HttpClient et la conception des délais d’expiration eux-mêmes sont traités dans « N’enfermez pas HttpClient dans un using ». Le centre de cet article est depuis quels réglages le proxy est résolu, et où la communication s’arrête ensuite.

1. D’abord la conclusion

Il y a trois points à fixer d’abord.

  • Avant de regarder les réglages, identifiez l’application et son compte d’exécution. Laquelle des trois familles — paramètres par utilisateur de WinINET, paramètres machine de WinHTTP, variables d’environnement — est lue se décide côté application. Les réglages qu’un administrateur voit sur son écran ne sont pas forcément visibles depuis un service.123
  • Enquêtez avec l’URL qui échoue, pas avec une qui marche. PAC renvoie un proxy ou DIRECT par URL. Dans .NET aussi, l’itinéraire change selon le runtime, les variables d’environnement et un réglage explicite du handler.456
  • Enquêtez séparément l’itinéraire, l’authentification et les certificats. Le 407 est l’authentification du proxy, distincte d’un 401 de la destination. Une erreur de certificat due à l’inspection TLS se traite en déployant la CA interne et en configurant les exclusions nécessaires, pas en désactivant la validation.783
Informations à aligner pour une enquête proxyIdentifier la pile HTTP et le compte d'exécution de l'application, aligner les réglages visibles depuis ce compte et l'URL qui échoue, puis enquêter sur l'itinéraire, l'authentification et les certificatsPile HTTP et compteVérifier les réglages de ce compteVérifier l'itinéraire avec l'URL qui échoueEnquêter aussi séparément l'authentification et les certificats

Figure 1 : Alignez « quels réglages », « vus depuis le compte de qui » et « quelle URL » avant d’enquêter sur le lieu de l’échec.

En une phrase : quand vous dites « j’ai vérifié les réglages de proxy », soyez en mesure de dire laquelle des trois familles vous avez vérifiée, et depuis quel compte.

Dans le diagramme, un trait continu marque une relation qui vaut toujours et un trait pointillé une relation conditionnelle (les conditions figurent dans l’explication de chaque relation sur la page de détail). La liste complète des relations (19 au total, avec preuve et niveau de certitude) et les définitions des concepts principaux sont rassemblées sur la page de détail de la carte des connaissances (en japonais). Données : JSON-LD / Turtle

2. Windows a trois familles de « réglages de proxy »

Les chemins par lesquels une application sous Windows trouve le proxy d’entreprise se répartissent en trois grandes familles.

Famille de réglages Où les fixer, ou la commande Portée Ce qui les lit principalement
(1) WinINET (Options Internet) Application Paramètres > Réseau et Internet > Proxy, inetcpl.cpl Par utilisateur (défaut) Navigateurs, applications de bureau interactives, .NET Framework par défaut
(2) WinHTTP (réglages machine) netsh winhttp set proxy / set advproxy Machine Services Windows, certains composants de l’OS
(3) Variables d’environnement HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / NO_PROXY Processus (héritées selon le lieu de définition) HttpClient de .NET (Core et suivants), curl, outils multiplateformes tels que Node.js et Python

« Les réglages de proxy Windows » désignent d’ordinaire (1)

Le « Proxy » visible dans l’application Paramètres, c’est historiquement les Options Internet d’Internet Explorer, c’est-à-dire la configuration de WinINET. Par défaut, elle est enregistrée par utilisateur.3

(2) est le défaut par machine pour les contextes sans utilisateur connecté, comme les services. (3) est surtout la convention d’outils d’origine multiplateforme ; sous Windows, .NET (Core et suivants), curl et leurs équivalents la lisent.5

C’est l’application, pas la personne qui a configuré, qui décide ce qui est lu

La source est fixée par l’application : (1) pour une application qui utilise WinINET, (2) ou un réglage propre à l’application pour WinHTTP, et (3) puis (1) pour .NET (Core et suivants).

Donc, lorsque « les réglages sont justes mais cela ne se connecte toujours pas », confirmez d’abord si les réglages que vous avez vérifiés et ceux que l’application a lus appartiennent à la même famille. Avant de parcourir les trois familles pour leur donner la même valeur, il importe d’identifier le point d’entrée de l’application cible.

Certaines configurations sont par appareil plutôt que par utilisateur

En activant la stratégie de groupe « Définir les paramètres de proxy par ordinateur (et non par utilisateur) », on bascule (1) à la portée machine et on applique les mêmes réglages à tous les utilisateurs. Avec une MDM (Intune et équivalents), le CSP NetworkProxy configure par appareil.3

Changer la portée des réglages par utilisateurLes réglages WinINET sont par utilisateur par défaut, mais la stratégie de groupe peut les basculer en réglages par ordinateur, et la MDM peut les configurer par appareil via le CSP NetworkProxyLes réglages WinINET sont par utilisateur par défautLa GPO les bascule par ordinateurLes mêmes réglages s'appliquent à tous les utilisateursCSP NetworkProxy de la MDMConfiguré par appareil

Figure 2 : Parce que certaines configurations changent la portée de (1) en par appareil, lisez « par utilisateur » comme l’état par défaut.

3. WinINET et WinHTTP — l’un pour les applications interactives, l’autre pour les services

3.1. Des rôles différents

WinINET et WinHTTP sont tous deux des piles clientes HTTP standard de Windows. Ils diffèrent toutefois par le modèle d’exécution qu’ils supposent.

WinINET est destiné aux applications de bureau interactives. Il hérite automatiquement des Options Internet de l’utilisateur, du proxy, des cookies et du cache d’informations d’identification, et peut afficher une interface de saisie des informations d’identification si besoin. En revanche, l’usage dans un service ou un processus de type service n’est pas pris en charge.1

WinHTTP est destiné aux services et au côté serveur. Il prend en charge l’exécution sous un compte de service, l’emprunt d’identité de thread et l’isolation de session. En échange, il ne partage ni les réglages, ni les cookies, ni les informations d’identification du navigateur, et n’affiche aucune interface.2

Le guide de choix de Microsoft est de même WinINET, sauf si vous êtes dans un service ou un processus de type service qui a besoin d’isolation de session ou d’emprunt d’identité, et WinHTTP pour les services.1 Cela ne signifie pas, toutefois, que toute application qui tourne en service lit les réglages machine de WinHTTP. Les services écrits en .NET sont traités à part à la section 3.3.

3.2. Opérations de base de netsh winhttp

Le proxy par défaut machine de WinHTTP se gère avec netsh.9

:: Afficher les réglages de proxy WinHTTP actuels
netsh winhttp show proxy

:: Définir un proxy statique (avec une liste de contournement)
netsh winhttp set proxy proxy-server="proxy.example.co.jp:8080" bypass-list="*.example.co.jp;<local>"

:: Importer les réglages des Options Internet (WinINET)
netsh winhttp import proxy source=ie

:: Revenir au défaut (DIRECT)
netsh winhttp reset proxy

Ne pas confondre réglage statique, import et autoconfiguration

set proxy est un réglage statique. Il ne gère ni la détection automatique, ni une URL PAC, ni l’authentification proxy.3

import proxy source=ie copie les réglages statiques tels qu’ils sont au moment de l’exécution. Si les Options Internet changent ensuite, le côté WinHTTP ne suit pas.

L'import des réglages de proxy est une copie uniqueimport proxy source=ie ne copie dans WinHTTP que les réglages statiques de cet instant, et les changements ultérieurs des Options Internet ne sont pas suivis automatiquementRéglages statiques au moment de l'exécutionimport proxy source=ieCopiés dans WinHTTPLes changements ultérieurs ne sont pas suivis automatiquement

Figure 3 : import n’est pas un réglage de synchronisation, mais une opération qui reprend les réglages statiques de cet instant.

Pour configurer la machine en y incluant PAC et la détection automatique WPAD, utilisez netsh winhttp set advproxy. Les réglages avancés au format JSON comprennent Proxy, ProxyBypass, AutoconfigUrl et AutoDetect.9

3.3. Le piège le plus fréquent : un service ne lit pas les réglages IE de l’utilisateur

Le cas typique est celui d’un développeur qui déplace un outil qui tournait sur son PC vers un service Windows exécuté en LocalSystem.

Même s’il communiquait pendant le développement via les réglages par utilisateur du développeur (1), les réglages visibles depuis LocalSystem sont autre chose. Si les réglages machine de WinHTTP ne sont pas configurés (DIRECT), l’outil tente de joindre l’API externe en direct et expire. La procédure pour en faire un service est traitée dans « Comment créer et exploiter un service Windows ».

Le décalage lorsqu'un outil lancé à la main devient un serviceQuand un outil qui tournait sous les réglages par utilisateur du développeur devient un service LocalSystem, les réglages visibles changent, et si le défaut WinHTTP est DIRECT il tente une connexion directe et échoueExécution manuelle en tant que développeurCommunique avec vos propres réglagesPassage en service LocalSystemLes réglages visibles changentConnexion directe si WinHTTP n'est pas configuréExpiration sur l'API externe

Figure 4 : Même sur la même machine, changer le compte d’exécution change les réglages que l’on peut voir.

Fournir les réglages sous la forme que lit la pile HTTP

Pour un processus qui communique même lorsqu’aucun utilisateur n’est connecté, fournissez des réglages de portée machine. La façon de les configurer, toutefois, doit correspondre à la pile HTTP.

Cible Comment fournir les réglages
Applications natives et composants Windows qui utilisent WinHTTP Fournir les réglages WinHTTP via netsh3
Services qui utilisent HttpClient de .NET (Core et suivants) Variables d’environnement système (HTTPS_PROXY et équivalents), ou un HttpClientHandler.Proxy explicite depuis la configuration de l’application

HttpClient de .NET (Core et suivants) ne lit pas les réglages machine de WinHTTP. Ne concluez pas que « c’est un service, donc configurer netsh suffit ». L’ordre de priorité détaillé est au chapitre 5.

Un réglage statique sur un portable qui sort du bureau casse dans l’autre sens

Si vous figez le proxy statique de l’entreprise sur un portable, le proxy est injoignable hors du bureau et la communication échoue. Traitez les réglages machine statiques comme un outil pour des serveurs dont la configuration réseau ne change pas.3

4. PAC et WPAD — de quoi se compose l’« autoconfiguration »

PAC calcule l’itinéraire, et WPAD trouve où se trouve le PAC. Découper l’« autoconfiguration » en ces deux parties montre où regarder.

4.1. Le fichier PAC et FindProxyForURL

PAC (Proxy Auto-Configuration) est un fichier écrit en JavaScript (ECMAScript). Sa fonction obligatoire FindProxyForURL(url, host) renvoie, pour l’URL et l’hôte donnés, soit la liste des proxys à utiliser, soit DIRECT, c’est-à-dire une connexion directe.10

function FindProxyForURL(url, host) {
    // Le domaine interne et les adresses privées se connectent en direct
    if (dnsDomainIs(host, ".example.co.jp") ||
        isInNet(host, "10.0.0.0", "255.0.0.0")) {
        return "DIRECT";
    }
    // Tout le reste passe par le proxy. En cas d'indisponibilité du premier, basculer sur le suivant
    return "PROXY proxy1.example.co.jp:8080; PROXY proxy2.example.co.jp:8080; DIRECT";
}

Dans cet exemple, le domaine interne et les adresses privées indiquées se connectent en direct, et tout le reste passe par le proxy. Dans ce second cas, si le premier proxy est indisponible on passe au suivant, et on retombe enfin sur DIRECT.

PAC change l'itinéraire selon la destinationL'exemple de PAC montré évalue l'URL et l'hôte, renvoie DIRECT pour le domaine interne et les adresses privées indiquées, et sinon une liste ordonnée de proxysOuiNonPasser l'URL et l'hôteCorrespond aux conditions internes de l'exemple ?Renvoyer DIRECTProxy 1, proxy 2, puis DIRECT

Figure 5 : Parce que la réponse du PAC change par URL, le succès d’un autre site ne confirme pas l’itinéraire de l’API qui échoue.

Deux précautions d’enquête en découlent.

Vérifiez en passant l’URL qui échoue. PAC peut renvoyer une réponse différente pour chaque URL. La fonction de proxy automatique de WinHTTP est aussi conçue pour être interrogée à chaque fois avec l’URL de la requête. « D’autres sites sont visibles dans le navigateur » n’est pas la preuve que l’API qui échoue emprunte le même itinéraire.4

Pour un trafic absent du journal du proxy, suspectez aussi DIRECT et les contournements. DIRECT est une instruction « allez sans le proxy ». Si le trafic interne n’apparaît pas dans le journal, vérifiez un résultat DIRECT du PAC ou une correspondance dans la liste de contournement.

4.2. Détection automatique via WPAD

Activer « Détecter automatiquement les paramètres » utilise WPAD (Web Proxy Auto-Discovery) pour trouver où se trouve le fichier PAC. En général, l’URL PAC est distribuée par DHCP, ou un hôte nommé wpad est résolu via DNS et le fichier est récupéré à une URL telle que http://wpad/wpad.dat.11

De la détection automatique jusqu'à la récupération du PACDans WPAD, l'emplacement du fichier PAC est trouvé via DHCP ou DNS, et le PAC est récupéré à cet emplacement puis utilisé pour calculer les itinérairesActiver la détection automatiqueTrouver l'emplacement via DHCP ou DNSRécupérer le fichier PACCalculer l'itinéraire par destinationLa détection échoue si rien n'est mis en place

Figure 6 : La détection automatique a besoin de la mise en place DHCP/DNS côté réseau.

Activer la seule détection automatique sur un réseau sans cette mise en place ne fait rien, et ajoute l’attente jusqu’à l’échec de la détection. Choisir « automatique » ne résout pas partout.

4.3. Comportement des clients qui ne peuvent pas lire un PAC

Même si vous distribuez un PAC, tous les clients ne l’évaluent pas. netsh winhttp set proxy est un réglage statique, et les outils qui suivent la convention de variable d’environnement HTTP_PROXY n’ont en général nulle part où mettre une URL PAC non plus. Ils prennent une URL de proxy fixe.35

Pour une application native qui utilise WinHTTP directement, vérifiez comment la session est ouverte.

Usage de WinHttpOpen Traitement du proxy automatique
WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY sous Windows 8.1 ou ultérieur WinHTTP résout le proxy automatiquement par requête à partir des réglages système/utilisateur (y compris WPAD/PAC)12
Le WINHTTP_ACCESS_TYPE_DEFAULT_PROXY traditionnel et équivalents L’application elle-même doit appeler WinHttpGetProxyForUrl et appliquer le résultat à la requête. DEFAULT_PROXY est déconseillé à partir de 8.11012
Vérifier si WinHTTP utilise le PACSi la session WinHTTP est ouverte avec AUTOMATIC_PROXY le proxy est résolu automatiquement, mais avec l'ouverture traditionnelle l'application doit appeler l'API AutoProxy et appliquer le résultatOuiOuverture traditionnelleVérifier les paramètres de WinHttpOpenAUTOMATIC_PROXY ?WinHTTP résout automatiquementL'application appelle l'API AutoProxyAppliquer le résultat à la requête

Figure 7 : Savoir seulement qu’une application utilise WinHTTP ne dit pas que le PAC est utilisé automatiquement aussi.

Dans les implémentations plus anciennes, un PAC peut exister et n’être pourtant pas utilisé. Sur un réseau exploité avec PAC, décidez aussi quoi donner, via des réglages statiques ou des variables d’environnement, aux clients qui ne peuvent pas lire le PAC.

5. Résolution de proxy dans .NET — Framework et Core et suivants sont des choses différentes

.NET Framework et .NET (Core et suivants) déterminent le proxy par défaut différemment. Enquêter sur une application .NET 8 avec des connaissances de l’ère Framework peut vous faire vérifier les mauvais réglages.

5.1. .NET Framework — les Options Internet par défaut, remplacées par defaultProxy

HttpWebRequest de .NET Framework, et le HttpClient construit dessus, utilisent le proxy par défaut sauf si Proxy est défini explicitement. Ce défaut se détermine en combinant les réglages Internet du compte d’exécution (l’équivalent WinINET) et le fichier de configuration, et les réglages du fichier de configuration ont la priorité.6

On le pilote via system.net/defaultProxy dans app.config ou machine.config.13

<configuration>
  <system.net>
    <!-- useDefaultCredentials : envoyer ou non les informations d'identification par défaut à un proxy authentifiant -->
    <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 vide, les réglages des Options Internet sont utilisés ; si proxyaddress et équivalents sont spécifiés, ceux-ci ont la priorité. Depuis le code, WebRequest.DefaultWebProxy replace le même défaut.136

Le proxy par défaut de .NET Framework.NET Framework part des réglages Internet du compte d'exécution et donne la priorité aux valeurs spécifiées dans le fichier de configuration pour déterminer le proxy par défautRéglages du compte d'exécutionLe fichier de configuration a la prioritéProxy par défaut de FrameworkRemplacé via DefaultWebProxy

Figure 8 : Le défaut Framework, ce sont les réglages du « compte d’exécution », qui ne sont pas forcément ceux visibles à l’écran de l’administrateur.

Lors de l’exécution sous un compte de service, la même prudence qu’à la section 3.3 s’applique. Ce qu’il lit par défaut, ce sont les Options Internet de ce compte, distinctes de ce qui est visible sur le bureau de l’administrateur, et en général vides.

5.2. .NET (Core et suivants) — les variables d’environnement d’abord, puis les réglages utilisateur de l’OS

.NET (Core et suivants) a la propriété statique HttpClient.DefaultProxy. C’est le défaut utilisé lorsque le handler ne spécifie pas de proxy explicitement, et sous Windows il est initialisé en lisant les variables d’environnement puis, si elles ne sont pas définies, les réglages de proxy de l’utilisateur, dans cet ordre.5

Variable d’environnement Signification
HTTP_PROXY Proxy utilisé pour les requêtes HTTP
HTTPS_PROXY Proxy utilisé pour les requêtes HTTPS
ALL_PROXY Repli lorsque les précédentes ne sont pas définies
NO_PROXY Liste d’hôtes séparés par des virgules pour lesquels aucun proxy n’est utilisé

Séparer les trois variables qui spécifient un proxy de NO_PROXY

Si l’une de HTTP_PROXY, HTTPS_PROXY ou ALL_PROXY est définie, elle a la priorité sur les réglages de l’OS. Un HTTPS_PROXY laissé par un test, ou injecté par un modèle CI/CD, envoie le trafic sur un itinéraire différent des réglages que vous avez vus à l’écran.

En revanche, définir seulement NO_PROXY ne configure pas de proxy depuis les variables d’environnement. Sous Windows, les réglages de proxy utilisateur de l’OS continuent d’être utilisés.

Initialisation du proxy par défaut dans .NET sous WindowsSi l'une de HTTP_PROXY, HTTPS_PROXY et ALL_PROXY est définie les variables d'environnement ont la priorité, et si aucune n'est définie les réglages utilisateur Windows sont utilisés. NO_PROXY seul ne configure pas de proxy depuis les variables d'environnementOuiNonInitialiser le proxy par défautL'une des 3 variables de proxy est-elle définie ?Les variables d'environnement ont la prioritéRéglages utilisateur WindowsNO_PROXY seul ne configure rien

Figure 9 : Vérifiez d’abord si un proxy est spécifié par des variables d’environnement, et distinguez cela d’un état avec seulement NO_PROXY.

Le « point en tête » de NO_PROXY et la différence sous Linux

NO_PROXY ne prend pas en charge les jokers (*). .example.com avec un point en tête correspond à www.example.com mais pas à example.com lui-même.5

Dans les conteneurs Linux et équivalents, le défaut est l’absence de proxy si les variables d’environnement ne sont pas définies. Parce que le comportement par défaut diffère entre Windows et Linux, vérifiez-le aussi lors d’un passage en conteneur.5

5.3. Configuration explicite — HttpClientHandler.Proxy et UseProxy

Sur les deux runtimes, un HttpClientHandler.Proxy explicite a la plus haute priorité. Il prime sur les réglages de l’OS et le fichier de configuration. Avec UseProxy = false, aucun proxy n’est utilisé.11

using System.Net;

// Utiliser explicitement un proxy lu depuis la configuration de l'application
var handler = new HttpClientHandler
{
    Proxy = new WebProxy("http://proxy.example.co.jp:8080")
    {
        BypassProxyOnLocal = true,
        BypassList = new[] { @"^intra\.example\.co\.jp$" },
        UseDefaultCredentials = true // Pour un proxy authentifiant, répondre avec les informations d'identification du compte d'exécution
    },
    UseProxy = true
};
var client = new HttpClient(handler);

// Un client qui n'utilise jamais de proxy (pour les connexions directes aux API internes)
var directHandler = new HttpClientHandler { UseProxy = false };
var directClient = new HttpClient(directHandler);
Déterminer le proxy effectif à partir du handlerSi UseProxy est false la connexion est directe, si true le Proxy explicite du handler est utilisé, et s'il n'y a pas de réglage explicite le proxy par défaut est utiliséNonOuiOuiNonUseProxy est-il true ?Connexion directeProxy défini explicitement ?Utiliser le proxy spécifiéUtiliser le proxy par défaut

Figure 10 : Avant d’enquêter sur le proxy par défaut, vérifiez le réglage explicite du handler et UseProxy.

Attention aussi au contournement automatique des destinations locales

Lorsqu’il n’y a pas de réglage explicite et que l’on suit les réglages de l’OS, les noms plats sans point, les adresses de bouclage et les destinations correspondant au suffixe de domaine de la machine peuvent être traités comme « locaux » et contournés.11

Lorsque « le comportement diffère entre une adresse IP directe et un nom » ou « cela a commencé à passer par le proxy une fois le FQDN utilisé », vérifiez cette détermination.

L’ordre de priorité jusqu’ici se résume ainsi.

Priorité (de la plus haute à la plus basse) .NET Framework .NET (Core et suivants)
1 Réglage explicite tel que HttpClientHandler.Proxy Identique à gauche
2 defaultProxy dans app.config Affectation à HttpClient.DefaultProxy
3 Options Internet du compte d’exécution Variables d’environnement (HTTP_PROXY et équivalents)
4 — Réglages de proxy utilisateur Windows

6. Proxys authentifiants — le 407 est une erreur d’authentification « du proxy »

6.1. Ne pas confondre 407 et 401

Même après avoir atteint le proxy, on n’avance pas sans passer l’authentification. Distinguez qui exige l’authentification d’après le code d’état et l’en-tête.7

Réponse Qui exige l’authentification En-tête à vérifier
407 Proxy Authentication Required Le proxy Proxy-Authenticate
401 Le serveur de destination WWW-Authenticate

Sur un 407, vérifiez d’abord les schémas listés dans Proxy-Authenticate. Basic envoie un nom d’utilisateur et un mot de passe, alors que Negotiate (Kerberos/NTLM) et équivalents sont des schémas défi/réponse. Dans ces derniers, le mot de passe lui-même ne circule pas, et l’authentification se termine en plusieurs allers-retours.7

Flux de réponse à un proxy authentifiantLe client reçoit 407 et une indication du schéma d'authentification de la part du proxy, et répond avec les informations d'identification de ce schéma. Les schémas défi-réponse nécessitent plusieurs allers-retoursProxyClientProxyClientPlusieurs allers-retours selon le schémaDemander la communication407 avec Proxy-AuthenticateRépondre à l'authentification selon le schéma

Figure 11 : Sur un 407, vérifiez les informations d’authentification envoyées au proxy, pas au serveur de destination.

Le schéma d’authentification vers lequel les choses « retombent » est détaillé dans « NTLM et Kerberos expliqués en images ».

6.2. Passer les informations d’identification dans .NET

L’endroit où configurer diffère selon que l’on suit le proxy par défaut ou que l’on spécifie un proxy explicitement.

Pour utiliser le proxy par défaut et passer des informations d’identification, utilisez HttpClientHandler.DefaultProxyCredentials. Ce sont les informations d’identification envoyées au proxy par défaut lorsque UseProxy = true et Proxy = null.14

using System.Net;

var handler = new HttpClientHandler
{
    UseProxy = true,   // Le défaut. Combiné à un Proxy null, le proxy par défaut du système est utilisé
    Proxy = null,
    // Répondre au 407 avec les informations d'identification du compte d'exécution (utilisateur connecté ou compte de service)
    DefaultProxyCredentials = CredentialCache.DefaultCredentials
};
var client = new HttpClient(handler);

Lorsque vous spécifiez le proxy explicitement, donnez les informations d’identification au WebProxy. Dans la plupart des scénarios clients, la recommandation est d’utiliser les informations d’identification par défaut de l’utilisateur connecté plutôt qu’un nom d’utilisateur et un mot de passe individuels, ce que fait WebProxy.UseDefaultCredentials = true.15

6.3. Le problème 407 du compte de service

Les « informations d’identification par défaut » sont celles du compte qui exécute le processus. Pour un utilisateur interactif, l’authentification se fait en tant que cet utilisateur ; pour un service LocalSystem, en tant que compte ordinateur.

Devenir un service change qui est authentifiéAvec les informations d'identification par défaut, une exécution interactive authentifie en tant que cet utilisateur et un service LocalSystem en tant que compte ordinateur, donc vérifiez si le proxy peut authentifier ce principalUtilisateur interactifLocalSystemCompte d'exécution ?Informations d'identification de cet utilisateurCompte ordinateurVérifier si le proxy peut l'authentifier

Figure 12 : Même en laissant « par défaut » dans le code, le principal que le proxy authentifie change lorsque l’application devient un service.

Un proxy qui authentifie les utilisateurs via l’intégration AD peut être incapable d’authentifier un compte ordinateur ou un compte local, et les 407 continuent. Inversement, certains environnements prévoient des exemptions d’authentification pour les services, par IP source ou par compte.

Pour une application destinée à devenir un service, décidez donc dès la conception s’il faut utiliser un compte de service de domaine (gMSA et équivalents), mettre en place une exemption d’authentification sur le proxy, ou fournir un proxy relais interne qui n’a pas besoin d’authentification. Enquêter sur un 407 exige à la fois la configuration de l’application et « si le proxy peut authentifier ce compte d’exécution ».

Il existe aussi la méthode consistant à embarquer les informations d’identification dans une variable d’environnement, du type HTTP_PROXY=http://user:pass@proxy:8080.5 Parce que le mot de passe en clair est exposé dans les variables d’environnement, c’est-à-dire dans les informations du processus, ce n’est pas recommandé pour une exploitation permanente.

7. HTTPS et les proxys — tunnels CONNECT et inspection TLS

7.1. HTTPS traverse le proxy en « tunnel »

Pour utiliser un proxy en HTTPS, le client envoie d’abord CONNECT hôte-de-destination:443 pour ouvrir un tunnel TCP. En cas de succès, le proxy renvoie 200, après quoi le client et le serveur de destination effectuent la poignée de main TLS à l’intérieur du tunnel. Si le tunnel ne s’ouvre pas, un 407, un 502 ou équivalent revient.16

Jusqu'à l'ouverture du tunnel HTTPSEn HTTPS, une requête CONNECT ouvre un tunnel TCP, et après le 200 la poignée de main TLS a lieu à l'intérieur du tunnel. Si le tunnel ne s'ouvre pas, un 407 ou un 502 ou équivalent est renvoyéSuccès, 200ÉchecIndiquer la destination avec CONNECTTunnel ouvert ?Connexion TLS à l'intérieur du tunnel407, 502, etc.

Figure 13 : Lisez un échec au stade de l’ouverture du tunnel séparément d’un échec de la connexion TLS qui suit.

Dans ce modèle « en transit », le proxy ne peut pas lire le contenu HTTPS chiffré. Ce qui apparaît dans le journal, c’est seulement le nom d’hôte de destination et si la connexion a réussi ; le chemin d’URL n’est pas visible.

7.2. Proxys d’inspection TLS et erreurs de certificat

Dans le modèle d’inspection TLS (décryptage SSL, break and inspect), le proxy termine TLS, déchiffre et inspecte le trafic, puis le rechiffre. Le certificat présenté au client est aussi remplacé par un certificat re-signé par la propre CA du proxy.8

L'inspection TLS change le certificatDans l'inspection TLS, le proxy termine TLS pour inspecter le contenu et présente au client un certificat re-signé par sa propre CA, donc la confiance dans cette CA est requiseLe proxy termine TLSDéchiffrer, inspecter, rechiffrerCertificat re-signé par la CA interneConfiance dans la CA nécessaire côté client

Figure 14 : Dans le modèle d’inspection, la question n’est pas seulement le certificat de la destination, mais si l’on peut faire confiance à la CA interne.

D’abord, vérifier quel magasin de confiance sert à la validation

Cette configuration exige que le certificat CA du proxy soit déployé dans les racines de confiance de chaque client. Les erreurs de validation de certificat surviennent non seulement sur les machines qui ne l’ont pas reçu, mais aussi dans les runtimes qui utilisent leur propre magasin de confiance et ne regardent pas le magasin de certificats Windows.

Dans .NET, cela se manifeste typiquement par une HttpRequestException avec une AuthenticationException interne. Cherchez un message du type « the remote certificate is invalid ».

La correction, c’est de déployer la CA, pas de désactiver la validation

Le certificat CA interne est normalement déployé dans « Autorités de certification racines de confiance » de l’ordinateur local. Pour savoir quand utiliser plutôt le magasin utilisateur, voir « Guide pratique du magasin de certificats Windows ».

Ne contournez pas en renvoyant toujours true depuis ServerCertificateCustomValidationCallback. Cela reste une vulnérabilité dans laquelle une attaque de l’homme du milieu ne peut pas être détectée lorsque l’application est utilisée sur un réseau extérieur.

Exclure le trafic épinglé de l’inspection

Le trafic qui pratique l’épinglage de certificat (certificate pinning) échoue dès que le proxy remplace le certificat. Pour les composants Windows qui valident des certificats Microsoft spécifiques et équivalents, il n’y a pas de contournement, et une exclusion est requise.3

Séparer le déploiement de la CA de l'exclusion du trafic épingléPour une erreur de certificat sous inspection TLS, vérifiez la confiance dans la CA, mais pour le trafic qui épingle les certificats le remplacement lui-même est la cause de l'échec, donc excluez-le de l'inspectionOuiNonErreur de validation de certificatCertificat épinglé ?Exclure de l'inspectionVérifier le magasin de confiance utiliséVérifier le déploiement de la CA interne

Figure 15 : Déployer la CA interne et éviter le remplacement du certificat lui-même sont des corrections distinctes.

Microsoft recommande aussi d’exclure le trafic vers des SaaS tels que Microsoft 365 du déchiffrement et de l’inspection à la couche réseau.8 Si des erreurs de certificat ne surviennent qu’avec certains services cloud, suspectez la combinaison de la liste d’exclusion d’inspection et de l’épinglage.

8. Procédure d’isolement — identifier le responsable en cinq étapes

Dans une enquête réelle, vérifiez les mécanismes vus jusqu’ici dans l’ordre suivant.

Étape Que faire Ce que vous apprenez
(1) Reproduire Accéder à l’URL qui échoue avec curl.exe -v ou Invoke-WebRequest (si possible sur la même machine sous le même compte) Si le problème est propre à l’application ou à l’environnement
(2) Collecter les réglages Collecter les trois familles : netsh winhttp show proxy, les réglages par utilisateur et les variables d’environnement Quelle famille contient quoi
(3) Identifier le compte Identifier le compte sous lequel tourne l’application cible (un service, le Planificateur de tâches, ou un autre utilisateur) Avec quels réglages et quelles informations d’identification elle s’exécute
(4) Classer l’erreur Distinguer 407 / 403 / échec de résolution de noms / expiration / erreur de certificat S’il s’agit d’authentification proxy, de refus de stratégie, de l’itinéraire ou d’inspection TLS
(5) Journal du proxy Vérifier le journal d’accès du serveur proxy à l’heure concernée Si le proxy a été atteint du tout, et sous quelle identité il a authentifié

(1) Reproduire : même URL, mais alignez aussi la famille de réglages de l’outil

Accédez à l’URL qui échoue, si possible depuis la même machine et le même compte. Surveillez aussi les différences entre outils.

Outil Ce qu’il faut garder à l’esprit pendant l’enquête
Le curl.exe fourni avec Windows -x http://proxy:8080 spécifie le proxy explicitement. La validation TLS utilise normalement le magasin de certificats de l’OS (Schannel)
Invoke-WebRequest de Windows PowerShell 5.1 Résout du côté .NET Framework. Options Internet par défaut
Invoke-WebRequest de PowerShell 7 Résout du côté .NET. Les variables d’environnement ont la priorité

« curl passe mais l’application non » est un indice que les familles de réglages diffèrent. Ne concluez pas, du seul succès d’un autre outil, que l’application a emprunté le même itinéraire.

(2) Collecter les réglages : enregistrer les trois familles ensemble

En PowerShell, on peut les collecter comme suit. Le HKCU des réglages par utilisateur appartient au compte qui a exécuté cette commande.

# (1) Réglages par utilisateur (WinINET) -- notez que cela lit le HKCU du compte d'exécution
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' |
    Select-Object ProxyEnable, ProxyServer, ProxyOverride, AutoConfigURL

# (2) Réglages machine (WinHTTP)
netsh winhttp show proxy

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

(3) Identifier le compte : pour un service, revérifier sous le même compte

Identifiez si la cible tourne en service, depuis le Planificateur de tâches, ou en tant qu’un autre utilisateur. Pour un service, refaites la reproduction de (1) et la collecte de (2) sous le même compte. Un succès dans votre propre session d’administrateur n’est pas une preuve de ce que voit LocalSystem.

Reproduire sous le même compte d'exécutionParce qu'une collecte dans la session de l'administrateur n'est pas une preuve des réglages visibles depuis le service, identifiez le compte d'exécution de la cible puis revérifiez la reproduction et la collecte des réglages sous ce compteVérifié dans la session de l'administrateurIdentifier le compte d'exécution de la cibleReproduire et collecter sous le même compteComparer réglages et informations d'identification

Figure 16 : Confirmez que les informations rassemblées en (1) et (2) sont celles que voit le compte cible identifié en (3).

(4) Classer l’erreur : décomposer « impossible de se connecter »

Pour un 407, vérifiez l’authentification proxy au chapitre 6 ; pour une erreur de certificat, l’inspection TLS au chapitre 7. Pour une expiration, traitez l’impossibilité d’atteindre le proxy comme premier candidat et enquêtez sur l’itinéraire, la résolution de noms et les pare-feu. Un refus de stratégie 403 se tient aussi à part de l’authentification et des expirations.

Décider où enquêter d'après l'erreurRépartir les échecs de communication en 407, 403, expiration ou échec de résolution de noms, et erreur de certificat, et enquêter respectivement sur l'authentification, le refus de stratégie, l'itinéraire et l'inspection TLSÉchec de communication407 signifie authentification proxy403 signifie refus de stratégieExpiration ou résolution de noms signifie l'itinéraireErreur de certificat signifie TLS

Figure 17 : Découper par code d’état et exception restreint les réglages et journaux à vérifier.

Le schéma où la cause est une règle entrante du pare-feu Windows plutôt que le proxy est traité dans « Le pare-feu Windows et les applications métier ».

(5) Journal du proxy : confirmer l’arrivée et le compte authentifié

Dans le journal d’accès à l’heure concernée, confirmez si le proxy a été atteint et sous quelle identité il a authentifié. S’il n’y a aucune trace, traitez le trafic comme n’ayant jamais atteint le proxy, et enquêtez sur un résultat DIRECT du PAC, la liste de contournement, et des variables d’environnement laissées en place.

Si besoin, confirmez la destination réelle avec une capture de paquets. Pour la façon de la collecter, voir « Capture de paquets sous Windows en pratique — choisir entre pktmon, netsh trace et Wireshark ».

9. Recommandations de conception — rendre le proxy « configurable » dans l’application

La facilité d’une enquête dépend des réglages et des journaux de l’application. Pour une application livrée dans un environnement avec un proxy d’entreprise, fournissez les quatre éléments suivants.

Autoriser un proxy explicite et une connexion directe, pas seulement le suivi du défaut

Faites de « suivre les réglages de l’OS » le défaut, et pour les cas où le PAC ne peut pas être lu, où l’application tourne en service, ou où la configuration est inhabituelle, permettez de spécifier l’URL du proxy, la liste de contournement et « n’utiliser aucun proxy » depuis un fichier de configuration. Les points d’implémentation sont HttpClientHandler.Proxy et UseProxy de la section 5.3.11

Le défaut de .NET (Core et suivants) inclut aussi la priorité des variables d’environnement expliquée à la section 5.2. Même en s’en remettant au défaut, lisez quels réglages sont utilisés selon ces règles.

Mettre les exceptions internes sous une forme qui tient dans le guide de déploiement

Documentez lequel, d’un résultat DIRECT du PAC, de la liste de contournement et de NO_PROXY, exclut le trafic interne vers les API, les bases de données, les serveurs de licences et équivalents. Montrez, avec des exemples, que NO_PROXY ne prend pas en charge les jokers et ce que signifie le point en tête.5

Concevoir les délais d’expiration et les tentatives en supposant aussi l’itinéraire proxy

Attendre la fin d’un long délai d’expiration par défaut lorsque le proxy est en panne ou que l’authentification est en attente fige à la fois l’interface et les opérations. Séparez un délai de connexion plus court, et limitez les tentatives aux requêtes idempotentes. Les détails sont dans « N’enfermez pas HttpClient dans un using ».

Journaliser l’itinéraire à partir du handler effectivement configuré

Journaliser seulement HttpClient.DefaultProxy manque le réglage explicite du handler et UseProxy = false, et enregistre un itinéraire qui ne correspond pas. Il importe de sélectionner les réglages effectifs à partir du handler utilisé pour créer le HttpClient, et d’appliquer aussi la détermination de contournement de la destination.

using System.Net.Http;

// handler est la même instance que celle utilisée pour créer le HttpClient
// UseProxy=false signifie toujours le direct. Un réglage explicite est utilisé s'il est présent, sinon 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("HTTP send {Target} route {Route} running account {User}",
    target, route, Environment.UserName);
Journaliser l'itinéraire à partir de la configuration du clientSélectionner le proxy effectif à partir du handler utilisé pour créer le HttpClient, effectuer la détermination de contournement et la résolution de proxy de la destination, et journaliser l'itinéraire et le compte d'exécutionMême handler qu'à la créationAppliquer UseProxy et le réglage expliciteDétermination de contournement et résolution pour la destinationJournaliser l'itinéraire et le compte

Figure 18 : Journalisez l’itinéraire à partir de la configuration du client lui-même, pas seulement à partir du proxy par défaut.

Journaliser au démarrage les itinéraires vers les destinations principales et le compte d’exécution facilite le suivi des étapes (1) à (3) du chapitre 8. Quand quelqu’un dit « mais cela marche dans le navigateur », une conception qui tient face à l’enquête est celle dans laquelle l’application peut expliquer ses propres réglages et son itinéraire.

10. Synthèse

Dans une enquête proxy Windows, alignez d’abord la famille de réglages, le compte d’exécution et l’URL cible.

Les réglages par utilisateur de WinINET, les réglages machine de WinHTTP et les variables d’environnement sont des familles distinctes. Devenir un service change les réglages visibles et les informations d’identification, et l’ordre par défaut diffère aussi entre .NET Framework et .NET (Core et suivants). netsh winhttp set proxy à lui seul ne peut pas gérer PAC, la détection automatique ni l’authentification.

PAC renvoie un proxy ou DIRECT par URL, et WPAD a besoin de la mise en place côté réseau. Même une fois l’itinéraire déterminé, l’authentification proxy avec le 407 et la validation de certificat sous inspection TLS se vérifient séparément. Ne désactivez pas la validation de certificat ; déployez la CA et excluez le trafic épinglé.

L’isolement procède dans l’ordre reproduire, collecter les trois familles de réglages, identifier le compte d’exécution, classer l’erreur, puis le journal du proxy. Côté application, fournissez un proxy explicite et une connexion directe, des réglages d’exception, des délais d’expiration et une journalisation d’itinéraire.

La prochaine fois que l’on vous parle de « seule l’application métier ne se connecte pas », commencez par confirmer ceci.

Sous le compte de qui cette application tourne-t-elle, et laquelle des trois familles de réglages de proxy lit-elle ?

Cette seule question est le point d’entrée de l’enquête.

Articles connexes

Domaines de conseil associés

KomuraSoft LLC prend en charge l’enquête des problèmes de communication d’applications Windows dans des environnements avec proxy d’entreprise, proxy authentifiant et inspection TLS, tels que « cela marche sur la machine de développement mais ne communique pas sur le réseau du client » et « cela a cessé d’atteindre l’API externe une fois devenu un service », ainsi que le conseil sur la conception de communication des applications métier qui supposent un environnement proxy (réglages, délais d’expiration et conception des journaux). Commencer par mettre au clair les étapes de reproduction et la façon de collecter les journaux convient tout à fait.

Références

  1. Microsoft Learn, WinINet vs. WinHTTP. Sur le guide d’usage consistant à utiliser WinINET sauf si le processus est un service ou a besoin d’emprunt d’identité ou d’isolation de session, et le tableau comparatif des fonctions couvrant le cache d’informations d’identification, les invites d’informations d’identification, la prise en charge des services, l’emprunt d’identité, l’isolation de session, etc. ↩ ↩2 ↩3

  2. Microsoft Learn, About WinHTTP. Sur le fait que WinHTTP est une pile HTTP conçue pour les services et le côté serveur, qui prend en charge l’exécution sous un compte de service et l’emprunt d’identité, tout en ne partageant ni les cookies, ni le cache, ni les informations d’identification du navigateur, ni les Options Internet de l’utilisateur. ↩ ↩2

  3. Microsoft Learn, Using a proxy with Delivery Optimization. Sur le fait que netsh winhttp set proxy est un réglage statique qui ne prend pas en charge la détection automatique, une URL PAC ni l’authentification proxy, la configuration de proxy de portée appareil pour les contextes sans utilisateur connecté (le CSP NetworkProxy et la stratégie « Définir les paramètres de proxy par ordinateur »), et le trafic qui utilise l’épinglage de certificat qui échoue sous inspection TLS et exige une exclusion. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  4. Microsoft Learn, WinHttpGetProxyForUrl function. Sur le fait que la fonction est une implémentation du protocole WPAD qui doit être appelée par URL parce que le fichier PAC peut renvoyer un proxy différent pour chaque URL, et qu’elle prend en charge à la fois une URL PAC explicite et la détection automatique depuis le réseau. ↩ ↩2

  5. Microsoft Learn, HttpClient.DefaultProxy Property. Sur le fait que Windows lit d’abord les variables d’environnement HTTP_PROXY, HTTPS_PROXY, ALL_PROXY et NO_PROXY, puis les réglages de proxy de l’utilisateur si elles ne sont pas définies, que Linux s’initialise sans proxy lorsque les variables d’environnement sont absentes, que NO_PROXY ne prend pas en charge les jokers et utilise la correspondance de sous-domaine par point en tête, et que l’URL de proxy peut contenir un nom d’utilisateur et un mot de passe. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  6. Microsoft Learn, Configuring Internet Applications. Sur le fait que l’élément defaultProxy définit le proxy par défaut dans .NET Framework, qu’un HttpWebRequest sans propriété Proxy utilise le proxy par défaut, et que les réglages Internet du système sont combinés avec ceux du fichier de configuration, le fichier de configuration ayant la priorité. ↩ ↩2 ↩3

  7. Microsoft Learn, Authentication in WinHTTP. Sur le code d’état 407 et l’en-tête Proxy-Authenticate renvoyés lorsque l’authentification proxy est requise (l’authentification serveur utilise 401 et WWW-Authenticate), la différence entre l’authentification Basic et les schémas défi/réponse tels que Kerberos, et le fait que le nom d’utilisateur et le mot de passe ne circulent pas sur le réseau dans les schémas défi/réponse. ↩ ↩2 ↩3

  8. Microsoft Learn, Understanding implications when using network intermediation to decrypt or manipulate Microsoft 365 traffic at the network layer. Sur le fait que l’inspection TLS (décryptage SSL) est une configuration dans laquelle un proxy ou un pare-feu déchiffre, inspecte et rechiffre TLS, son potentiel à provoquer des dysfonctionnements et une dégradation de performances dans des services qui supposent un TLS de bout en bout, et la recommandation d’exclure le trafic Microsoft 365 du déchiffrement et de l’inspection à la couche réseau. ↩ ↩2 ↩3

  9. Microsoft Learn, netsh winhttp. Sur la syntaxe de netsh winhttp show/set/import/reset, les paramètres proxy-server et bypass-list de set proxy, import proxy source=ie, et les réglages de proxy avancés au format JSON (Proxy, ProxyBypass, AutoconfigUrl, AutoDetect) de set advproxy. ↩ ↩2

  10. Microsoft Learn, WinHTTP AutoProxy Support. Sur le fait que le script PAC contient la fonction FindProxyForURL(url, host) et calcule une liste de proxys par requête, une valeur de retour spéciale indiquant qu’une connexion directe est acceptable, et le fait que l’API AutoProxy traditionnelle n’est pas intégrée automatiquement à la pile HTTP, de sorte que l’application doit appeler WinHttpGetProxyForUrl elle-même. ↩ ↩2

  11. Microsoft Learn, Make HTTP requests with the HttpClient class. Sur les deux méthodes de configuration HttpClient.DefaultProxy et HttpClientHandler.Proxy, un Proxy explicite qui a la priorité sur le fichier de configuration et les réglages de l’ordinateur local, la configuration WPAD typique dans laquelle le fichier PAC (wpad.dat et équivalents) est obtenu via le nom DNS wpad ou DHCP, et la détermination de contournement des destinations locales fondée sur les noms plats, le bouclage et les correspondances de suffixe de domaine. ↩ ↩2 ↩3 ↩4

  12. Microsoft Learn, WinHttpOpen function. Sur la signification de chaque valeur de dwAccessType, WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY (Windows 8.1 et ultérieur) qui détermine le proxy automatiquement à partir des réglages de proxy système/utilisateur et gère aussi le basculement et l’authentification automatiquement, et WINHTTP_ACCESS_TYPE_DEFAULT_PROXY déconseillé à partir de 8.1. ↩ ↩2

  13. Microsoft Learn, defaultProxy element (network settings). Sur les attributs enabled et useDefaultCredentials de l’élément system.net/defaultProxy, ses éléments enfants proxy, bypasslist et module, l’utilisation des réglages de proxy du système lorsque l’élément est vide, et la configuration via HttpClient.DefaultProxy lors d’une migration vers .NET 6 ou ultérieur. ↩ ↩2

  14. Microsoft Learn, HttpClientHandler.DefaultProxyCredentials Property. Sur la propriété qui définit les informations d’identification utilisées pour s’authentifier auprès du proxy par défaut du système lorsque UseProxy vaut true et que Proxy est null. ↩

  15. Microsoft Learn, WebProxy.Credentials Property. Sur le fait que la propriété Credentials est les informations d’identification envoyées au proxy en réponse à HTTP 407, et la recommandation de définir UseDefaultCredentials à true dans la plupart des scénarios clients afin d’utiliser les informations d’identification par défaut de l’utilisateur connecté. ↩

  16. Microsoft Learn, Work with existing on-premises proxy servers. Sur le fait que la communication HTTPS sortante s’établit par une requête CONNECT vers le proxy, qu’un HTTP 200 est renvoyé en cas de succès, et que des réponses telles que 407 (authentification requise) et 502 indiquent que le proxy n’autorise pas la communication, de sorte que l’isolement doit se poursuivre avec l’équipe proxy. ↩

Articles récents partageant les mêmes étiquettes, pour approfondir des sujets proches.

Ces pages replacent le sujet dans un contexte plus large de services et de décisions.

Cet article est directement lié aux services suivants.

Questions fréquentes

Questions souvent posées lors d’une consultation sur le sujet de cet article.

Le navigateur se connecte, mais seule l'application métier ne passe pas le proxy d'entreprise. Pourquoi ?
Le navigateur lit les réglages de proxy par utilisateur de WinINET, mais une application métier ne lit pas forcément les mêmes. Une application qui tourne en service Windows, ou sous un autre compte, consulte les réglages visibles depuis ce compte, les réglages machine de WinHTTP, ou les variables d'environnement. Identifiez d'abord le compte d'exécution, puis vérifiez les réglages de proxy visibles depuis ce compte à la fois avec netsh winhttp show proxy et dans les réglages utilisateur. Si vous reproduisez avec curl.exe ou l'équivalent sous le même compte sur la même machine, vous pouvez traiter le cas comme un décalage entre familles de configuration plutôt qu'un problème propre à l'application.
J'ai configuré netsh winhttp set proxy, mais le trafic de l'application n'a pas changé. Pourquoi ?
Ce que netsh winhttp configure, c'est le défaut machine de WinHTTP. Cela n'affecte ni les navigateurs ni les applications interactives qui lisent WinINET, ni HttpClient de .NET (Core et suivants), qui privilégie les variables d'environnement. netsh winhttp set proxy est aussi un réglage statique ; il ne gère ni l'autoconfiguration PAC, ni la détection automatique, ni l'authentification proxy. Il faut d'abord confirmer quelle pile HTTP utilise l'application cible et depuis quelle famille de configuration elle résout le proxy.
Quels réglages de proxy une application .NET lit-elle ?
.NET Framework utilise par défaut les Options Internet (équivalent WinINET) du compte d'exécution, et vous pouvez les remplacer par l'élément system.net/defaultProxy dans app.config. HttpClient sur .NET (Core et suivants) lit d'abord les variables d'environnement HTTP_PROXY, HTTPS_PROXY et NO_PROXY, et si elles ne sont pas définies retombe sur les réglages de proxy utilisateur Windows. Dans les deux cas, un HttpClientHandler.Proxy explicite a la priorité. L'ordre de résolution par défaut diffère donc entre Framework et Core et suivants : il faut revérifier le comportement proxy à la migration.
Que faut-il vérifier lorsqu'un 407 Proxy Authentication Required est renvoyé ?
Le 407 est le signe que le proxy lui-même exige une authentification ; c'est autre chose qu'une erreur d'authentification du serveur de destination (401). Confirmez d'abord le schéma demandé par le proxy (Negotiate, NTLM, Basic) d'après l'en-tête Proxy-Authenticate, et dans .NET passez les informations d'identification avec HttpClientHandler.DefaultProxyCredentials ou WebProxy.UseDefaultCredentials. Dans une application qui tourne sous un compte de service, les « informations d'identification par défaut » deviennent celles de ce compte de service, d'où l'incident typique : cela marche pour un utilisateur interactif, puis 407 dès que vous en faites un service. Vérifiez aussi dans le journal côté proxy sous quelle identité il a authentifié.
Un proxy d'inspection TLS produit des erreurs de certificat. Puis-je désactiver la validation des certificats ?
La désactiver n'est pas recommandé. Un proxy d'inspection TLS déchiffre le trafic puis présente au client un certificat re-signé par sa propre CA, de sorte que la validation échoue si ce certificat CA n'est pas dans les racines de confiance. La correction juste est de déployer le certificat CA interne dans le magasin de certificats Windows (en général Autorités de certification racines de confiance de l'ordinateur local). Désactiver la validation dans le code signifie qu'une attaque de l'homme du milieu ne pourra pas être détectée lorsque l'application est utilisée sur un réseau extérieur, et la vulnérabilité demeure.

Profil de l’auteur

Page de présentation de l’auteur de l’article.

Go Komura

Représentant de KomuraSoft LLC

Spécialisé dans le développement de logiciels Windows, le conseil technique et l’analyse de pannes, notamment pour les systèmes existants et les incidents difficiles à reproduire.

Retour au blog