2010-08-10 6 views
2

Je suis en train d'écrire un test pour tester un service que je suis le déploiement, pour contourner les cert ssl vérifier que je mis en place une dérogation ssl en utilisant l'extrait ci-dessous:Restore vérification de remplacement du certificat SSL


public static void SSLValidationOverride() 
     { 
      ServicePointManager.ServerCertificateValidationCallback = new     RemoteCertificateValidationCallback(OnValidationCallback); 
     } 
private static bool OnValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) 
{ 
if (cert.subject == MyCertSubject) 
     return true; 
else 
     return false; 
} 

Maintenant, je dois appeler un autre webservice utilisant ssl dans le code et voulant passer à la vérification ssl par défaut avant de l'appeler. Quelle est la meilleure façon de le faire. MS help indique que la valeur par défaut de ServicePointManager.SecurityProtocol est null (http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol.aspx). Va-t-il le mettre à null passer à la validation ssl par défaut et existe-t-il un autre moyen de le faire.

Répondre

2

J'ai fini par mettre ServicePointManager.SecurityProtocol à null et cela fonctionne très bien. Bien que je suis toujours ouvert à de meilleures façons de le faire


public static void SSLValidationRestore() 
     { 
      ServicePointManager.ServerCertificateValidationCallback = null; 
     } 
+0

travaille pour moi. Testé en utilisant différents cas (bonnes et mauvaises URL https). –

2

La définition du rappel à null ne fonctionne pas. Au lieu de cela tous les certificats passent. Je ne comprends pas pourquoi tant de gens ont posté la valeur de null works ou - = works. Ni le travail ... au moins en 3.5. Après de nouveaux tests, il semble que la vérification soit simplement mise en cache. La revérification une fois que le certificat a été validé une fois ne provoque pas l'appel du callback.

+0

Je ne suis pas d'accord avec cela. Je viens de tester tous les moyens en utilisant les bonnes et mauvaises URLs HTTPS. En le remettant à zéro, il semble que le comportement par défaut soit rétabli. –

6

J'ai rencontré un problème similaire lors du développement d'un outil de diagnostic que j'ai créé. J'ai créé un service Windows qui fait des demandes à une liste d'URL. Pour chaque URL que je fais une demande sans validation de certificat en établissant ceci:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

puis avec le même URL que je tente également de faire une demande de validation de certificat en réinitialisant la propriété à null qui devrait fournir la fonctionnalité par défaut :

ServicePointManager.ServerCertificateValidationCallback = null; 

Cela a eu des résultats inattendus que ma demande est toujours faite sans la validation du certificat comme si la remise à zéro a été ignoré. Après le débogage je trouve que si j'ai attendu assez longtemps après avoir

ServicePointManager.ServerCertificateValidationCallback = null; 

il a été effectivement remis à zéro et ma demande a été faite avec la validation du certificat par défaut. donc je mets simplement un sommeil pendant 30 secondes avant que je la demande:

ServicePointManager.ServerCertificateValidationCallback = null; 
System.Threading.Thread.Sleep(30000); 
//Make request here 

Je ne comprends pas pourquoi cela fonctionne, mais il le fait et je suis sûr qu'il ya une meilleure façon de le faire et si vous sais comment alors s'il vous plaît faites le moi savoir.

+0

Est allé avec la même solution. J'utilise le délégué pour le désactiver avant, puis j'utilise un try/catch/finally pour le mettre à null dans le finally. –

0

J'ai rencontré un problème similaire. Au lieu d'appeler Thread.Sleep() sur la solution @Acode Monkey, vous pouvez remplacer ServicePointManager.MaxServicePointIdleTime par une valeur faible.

ServicePointManager.MaxServicePointIdleTime = 1; 
Questions connexes