J'essaie de trouver un moyen d'ignorer la vérification du certificat lorsque je demande une ressource Https, jusqu'à présent, j'ai trouvé un article utile sur Internet.
Mais j'ai encore un problème. Veuillez revoir mon code. Je ne comprends tout simplement pas ce que signifie le code ServicePointManager.ServerCertificateValidationCallback
.
Quand cette méthode déléguée sera-t-elle appelée? Et encore une question, à quel endroit dois-je écrire ce code? Avant d' ServicePointManager.ServerCertificateValidationCallback
exécuter ou avant Stream stream = request.GetRequestStream()
?
public HttpWebRequest GetRequest()
{
CookieContainer cookieContainer = new CookieContainer();
// Create a request to the server
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_remoteUrl);
#region Set request parameters
request.Method = _context.Request.HttpMethod;
request.UserAgent = _context.Request.UserAgent;
request.KeepAlive = true;
request.CookieContainer = cookieContainer;
request.PreAuthenticate = true;
request.AllowAutoRedirect = false;
#endregion
// For POST, write the post data extracted from the incoming request
if (request.Method == "POST")
{
Stream clientStream = _context.Request.InputStream;
request.ContentType = _context.Request.ContentType;
request.ContentLength = clientStream.Length;
ServicePointManager.ServerCertificateValidationCallback = delegate(
Object obj, X509Certificate certificate, X509Chain chain,
SslPolicyErrors errors)
{
return (true);
};
Stream stream = request.GetRequestStream();
....
}
....
return request;
}
}
c#
ssl
httpwebrequest
certificate
Joe.wang
la source
la source
Réponses:
Puisqu'il n'y a qu'un seul ServicePointManager global , la définition de ServicePointManager.ServerCertificateValidationCallback produira le résultat que toutes les demandes suivantes hériteront de cette stratégie. Puisqu'il s'agit d'un "paramètre" global, il serait préférable de le définir dans la méthode Application_Start de Global.asax .
La définition du rappel remplace le comportement par défaut et vous pouvez créer vous-même une routine de validation personnalisée.
la source
HttpWebRequest
. Si vous utilisez d'autres moyens, vous devrez regarder dans la documentation comment y parvenir.Pour toute personne intéressée par l'application de cette solution sur une base par demande, il s'agit d'une option et utilise une expression Lambda. La même expression Lambda peut également être appliquée au filtre global mentionné par blak3r. Cette méthode semble nécessiter .NET 4.5.
Dans .NET 4.0, l'expression Lambda peut être appliquée au filtre global en tant que tel
la source
true
est quelque chose que vous pouvez faire lorsque vous expérimentez pendant le développement, mais ce n'est pas sûr. Ce devrait être un conditionnel.(HttpWebRequest)WebRequest.Create(url)
est parfaitement valable, mais sur ma box,HttpWebRequest.Create(url)
existe toujours dans un projet ciblant .Net 4.6.2. Le choix du chef, mais à ce stade,HttpClient
c'est probablement la meilleure API à utiliser.Cela a fonctionné pour moi:
Extrait d'ici: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors
la source
Il existe également la solution de délégué court:
la source
true
n'est pas sûr.Il a été mentionné qu'avant .NET 4.5 la propriété sur la demande d'accès à son
ServicePointManager
n'était pas disponible.Voici le code .NET 4.0 qui vous donnera accès à la
ServicePoint
demande par requête. Il ne vous donne pas accès au rappel par demande, mais il devrait vous permettre d'obtenir plus de détails sur le problème. Accédez simplement aux propriétésscvPoint.Certificate
(ouClientCertificate
si vous préférez).la source
ignore
leur faire confiance, pas leur faire confiance.ServicePoint
je ne peux pas toujours faire confiance à tous les certificats SSL, ni ignorer tous les certificats , car je n'ai pasServerCertificateValidationCallback
délégué dans ServicePointÀ propos, c'est la manière la moins verbeuse de désactiver toute validation de certificat dans une application donnée que je connaisse:
la source
Plutôt que d'ajouter un rappel à ServicePointManager qui remplacera la validation de certificat globalement, vous pouvez définir le rappel sur une instance locale de HttpClient. Cette approche ne doit affecter que les appels effectués à l'aide de cette instance de HttpClient.
Voici un exemple de code montrant comment l'ignorance des erreurs de validation de certificat pour des serveurs spécifiques peut être implémentée dans un contrôleur d'API Web.
la source
Sur la base de la réponse d'Adam et du commentaire de Rob, j'ai utilisé ceci:
qui filtre quelque peu le "ignorant". D'autres émetteurs peuvent être ajoutés au besoin bien entendu. Cela a été testé dans .NET 2.0 car nous devons prendre en charge du code hérité.
la source
CA5386: Les outils d'analyse de vulnérabilité vous alerteront de ces codes.
Code correct:
la source
Pour .net core
la source
Exprimé explicitement ...
la source
En ajoutant aux réponses de Sani et blak3r, j'ai ajouté ce qui suit au code de démarrage de mon application, mais en VB:
Semble faire l'affaire.
la source
Conseil: vous pouvez également utiliser cette méthode pour suivre les certificats qui expireront bientôt. Cela peut sauver votre bacon si vous découvrez un certificat sur le point d'expirer et que vous pouvez le réparer à temps. Bon aussi pour les entreprises tierces - pour nous, c'est DHL / FedEx. DHL laisse juste un certificat expirer, ce qui nous gêne 3 jours avant Thanksgiving. Heureusement, je suis là pour le réparer ... cette fois!
la source
ProwlUtil.StepReached
?Plusieurs réponses ci-dessus fonctionnent. Je voulais une approche dans laquelle je ne devais pas continuer à faire des changements de code et ne rendais pas mon code non sécurisé. Par conséquent, j'ai créé une liste blanche. La liste blanche peut être conservée dans n'importe quelle banque de données. J'ai utilisé le fichier de configuration car c'est une très petite liste.
Mon code est ci-dessous.
la source
Version Unity C # de cette solution:
la source