2010-05-04 2 views
4

J'utilise un objet HttpWebRequest pour accéder à un service Web via un HTTP POST. Une partie de l'exigence est que je:Est-ce que HttpWebRequest prend automatiquement en charge la validation du certificat?

  1. Vérifiez que l'URL du certificat correspond à l'URL que je poste à
  2. Vérifiez que le certificat est valide et approuvé
  3. Vérifiez que le certificat n'a pas expiré

Est-ce que HttpWebRequest gère automatiquement cela pour moi? Je suppose que si l'une de ces conditions se présentait, j'obtiendrais l'exception standard «impossible d'établir une relation d'approbation pour l'identité du canal sécurisé SSL/TLS».

Répondre

2

Oui, c'est le cas. Vous devez utiliser le code this si vous souhaitez désactiver cette fonctionnalité.

+0

une preuve que cela se produit n'importe où? – Elazaron

+0

Avec le code lié, vous pouvez voir les gestionnaires d'événements qui vérifient le certificat. Ajoutez vos propres points d'arrêt là-bas pour le voir se produire. – David

0

Pas vraiment. Vous devez toujours vérifier si un sslpolicyerror est renvoyé à l'aide d'une fonction de rappel. Assurez-vous de tester votre implémentation par rapport à l'URL comme ceci https://rootkit.com/ qui utilise un cert auto-chanté.

void InitPhase() 
{ 
    // Override automatic validation of SSL server certificates. 
    ServicePointManager.ServerCertificateValidationCallback = 
      ValidateServerCertficate; 
} 
private static bool ValidateServerCertficate(
     object sender, 
     X509Certificate cert, 
     X509Chain chain, 
     SslPolicyErrors sslPolicyErrors) 
{ 
    if (sslPolicyErrors == SslPolicyErrors.None) 
    { 
     // Good certificate. 
     return true; 
    } 

    log.DebugFormat("SSL certificate error: {0}", sslPolicyErrors); 

    bool certMatch = false; // Assume failure 
    byte[] certHash = cert.GetCertHash(); 
    if (certHash.Length == apiCertHash.Length) 
    { 
     certMatch = true; // Now assume success. 
     for (int idx = 0; idx < certHash.Length; idx++) 
     { 
      if (certHash[idx] != apiCertHash[idx]) 
      { 
       certMatch = false; // No match 
       break; 
      } 
     } 
    } 

    // Return true => allow unauthenticated server, 
    //  false => disallow unauthenticated server. 
    return certMatch; 
} 
+0

Qu'est-ce que 'apiCertHash'? –

+0

@Oskar Berggren utilisé dans CER épinglage. – rook

+0

Eh bien, oui, mais je ne comprends pas ce que vous entendez par "pas vraiment" en réponse à la question. Je crois que la politique SSL va vérifier et échouer la connexion si l'une des trois règles énoncées dans la question sont brisées, même sans rappel. Le rappel serait en fait utilisé pour accepter la connexion malgré l'échec de l'une de ces vérifications. –

Questions connexes