Vérifier le certificate SSL distant lors de la demande HTTPS

Lors de l’envoi d’une requête HTTPS au serveur Web distant, j’utilise WebRequest, qui établit une connexion sécurisée avec le serveur Web distant. Pendant le développement, j’utilise un certificate auto-signé sur le serveur et WebRequest ne parvient pas à établir une connexion sécurisée, car le certificate n’est pas valide et correspond au comportement attendu.

J’ai trouvé ce code qui vérifie le certificate “à distance”, activé en appelant la méthode SetCertificatePolicy() dans le code suivant.

 public static void SetCertificatePolicy() { ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate; } ///  /// Remotes the certificatee validate. ///  private static bool RemoteCertificateValidate( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { // trust any certificatee!!! System.Console.WriteLine("Warning, trust any certificatee"); return true; } 

Je me demande s’il est possible de faire des vérifications spéciales sur le certificate SSL distant (en utilisant le code ci-dessus, par exemple), afin de pouvoir vérifier que le serveur Web distant utilise un certificate SSL valide, et non pas n’importe quel certificate valide, mais exactement celui Je voudrais? Par exemple, je veux m’assurer que je parle au site Web www.someplace.com, certificate délivré à ACME Inc, avec empreinte digitale 00:11:22: …..

Qu’est-ce qu’une approche “meilleure pratique” pour ce scénario?

Merci!

Si vous voulez vraiment vous en tenir à un certificate particulier, vous pouvez comparer les données du certificate (au format DER) à l’ byte[] de certificatee.GetRawCertData() .

Vous pouvez également utiliser GetCertHashSsortingng() et Subject sur le paramètre de certificatee dans RemoteCertificateValidate pour obtenir les informations recherchées. Le nom d’hôte doit figurer dans le nom alternatif de sujet du certificate ou, s’il n’y a pas d’autre nom sujet, dans le CN du nom sujet (distingué). Compte tenu de la façon dont .NET formate la chaîne de sujet, il devrait s’agir du premier CN = que vous y trouverez.

Vous obtiendrez également plus de données si le certificatee est une instance de X509Certificate2 . Vous pourrez alors obtenir SubjectName tant que X500PrincipalName et également les Extensions (pour vérifier l’extension du nom de sujet alternatif). Il peut être utile d’utiliser des outils tels que BouncyCastle pour parsingr le nom du sujet.

Vous êtes également susceptible d’obtenir davantage d’informations sur le nom d’hôte que vous essayez de contacter dans l’ sender , en fonction de son type d’exécution.