2010-08-19 4 views
3

Étant donné que les proxies HTTPS remplaceront le certificat SSL, quelles sont mes options pour déterminer si une connexion HTTPS donnée a un proxy au milieu?Est-il possible de déterminer si un proxy HTTPS est utilisé juste en regardant le certificat?

Je vais utiliser cette information pour déterminer ma politique d'application, car il y a des cas où je veux un tunnel crypté de bout en bout à 100% sans décryptage par un tiers.

Encore mieux si vous pouvez me dire comment le déterminer via C# dans une application .NET ou Silverlight.

Pour commencer, here est un exemple de méthode pour valider un certificat en utilisant .NET, mais je ne suis toujours pas sûr de savoir comment l'utiliser pour déterminer la partie du certificat à valider. De plus, je pense que le ServicePointManger est plus une classe de connexion "globale". Cela peut être trop large lorsque je teste une seule connexion HTTP et je ne suis pas sûr que ServicePointManager soit disponible dans Silverlight.

http://msdn.microsoft.com/en-us/library/bb408523.aspx

+0

Comment votre application faire la connexion sécurisée? WCF? HttpWebRequest? –

+0

Je suis à la recherche d'une solution générale qui répondra à toutes les méthodes de communication .NET. Oui, j'utilise WCF et HTTPWebRequest – LamonteCristo

Répondre

4

Vous avez deux options. La première option consiste à utiliser la classe ServicePointManager. Vous avez raison en ce sens qu'il gère tous les points de service, mais vous pouvez utiliser le paramètre « expéditeur » dans la méthode de rappel à la différence entre les différents points de service:

void SomeMethod() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += 
     ValidateServerCertificate; 

    var url = "https://mail.google.com/mail/?shva=1#inbox"; 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    request.GetResponse(); 
} 

private static bool ValidateServerCertificate(object sender, 
     X509Certificate certificate, X509Chain chain, 
     SslPolicyErrors sslpolicyerrors) 
{ 
    if(sender is HttpWebRequest) 
    { 
     var request = (HttpWebRequest) sender; 
     if(request.RequestUri.ToString() == "https://mail.google.com/mail/?shva=1#inbox") 
     { 
      return (certificate.GetPublicKeyString() == "The public key string you expect"); 
     } 
    } 
    return true; 
} 

Cette option fonctionne pour créé manuellement HttpWebRequest et WCF -created demandes, comme le "expéditeur" sera HttpWebRequest pour les deux. Je ne suis pas sûr si le "expéditeur" sera autre chose qu'un HttpWebRequest.

La deuxième option est d'obtenir le certificat du point de service directement:

void SomeMethod() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += 
     ValidateServerCertificate; 

    var url = "https://mail.google.com/mail/?shva=1#inbox"; 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    request.GetResponse(); 

    var serverCert = request.ServicePoint.Certificate; 
    // Validate the certificate. 
} 

Je ne pouvais pas savoir s'il est possible d'obtenir le ServicePoint utilisé par un proxy WCF. Si ce n'est pas possible, cette option ne fonctionnera pas pour WCF. Autre que cela, la plus grande différence est que la première option empêche la connexion si la validation du certificat échoue, tandis que la deuxième méthode ne validera qu'après que la connexion a été faite.

Si vous avez juste besoin de déterminer si une demande va passer par un proxy:

var httpRequest = (HttpWebRequest)WebRequest.Create("someurl"); 
var isUsingProxy = DoesRequstUseProxy(request); 

bool DoesRequestUseProxy(HttpWebRequest request) 
{ 
    if(request.Proxy == null) 
    { 
     return false; 
    } 

    return request.Proxy.GetProxy(request.RequestUri) != request.RequestUri; 
} 
+0

Merci, mais j'ai encore besoin de savoir quoi faire avec le CERT quand je l'aurai. N'y a-t-il aucun moyen générique de détecter un proxy via un cert? Dois-je coder en dur la chaîne de clé publique attendue dans mon application? Aussi je ne sais pas si cette approche fonctionne dans Silverlight ... Je doute si je peux obtenir l'accès ServicePointManager dans le Sandbox SLI – LamonteCristo

+0

L'approche de DoesRequestUseProxy ne fonctionnera pas si " WCCP "est utilisé sur le pare-feu. WCCP est un proxy transparent qui ne nécessite pas de configuration client. BlueCoat est un exemple de produit qui interagira avec toutes les données provenant d'un pare-feu et qui acheminera de manière transparente le trafic HTTPS. C'est pour cette raison que je pense que la seule méthode universelle est d'analyser le cert lui-même. – LamonteCristo

+0

J'ai mis à jour ma réponse pour montrer comment détecter si une requête Web utilise un proxy. Malheureusement, je viens de confirmer qu'aucun code de ma réponse ne fonctionnera dans Silverlight. –

Questions connexes