Ich versuche einen Weg zu finden, die Zertifikatsprüfung zu ignorieren, wenn eine HTTP-Ressource angefordert wird. Bisher habe ich einen hilfreichen Artikel im Internet gefunden.
Aber ich habe immer noch ein Problem. Bitte überprüfen Sie meinen Code. Ich verstehe einfach nicht, was der Code ServicePointManager.ServerCertificateValidationCallback
bedeutet.
Wann wird diese Delegatmethode aufgerufen? Und noch eine Frage, an welcher Stelle soll ich diesen Code schreiben? Vor ServicePointManager.ServerCertificateValidationCallback
oder vor der Ausführung 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
quelle
quelle
Antworten:
Da es nur einen globalen ServicePointManager gibt , führt das Festlegen von ServicePointManager.ServerCertificateValidationCallback dazu, dass alle nachfolgenden Anforderungen diese Richtlinie erben. Da es sich um eine globale "Einstellung" handelt, ist es vorzuziehen , sie in der Application_Start- Methode in Global.asax festzulegen .
Durch Festlegen des Rückrufs wird das Standardverhalten überschrieben, und Sie können selbst eine benutzerdefinierte Validierungsroutine erstellen.
quelle
HttpWebRequest
. Wenn Sie andere Mittel verwenden, müssen Sie in der Dokumentation nachsehen, wie dies erreicht werden kann.Für alle, die diese Lösung auf Anfrage anwenden möchten, ist dies eine Option und verwendet einen Lambda-Ausdruck. Der gleiche Lambda-Ausdruck kann auch auf den von blak3r erwähnten globalen Filter angewendet werden. Diese Methode scheint .NET 4.5 zu erfordern.
In .NET 4.0 kann der Lambda-Ausdruck als solcher auf den globalen Filter angewendet werden
quelle
true
ist etwas, das Sie tun können, wenn Sie während der Entwicklung experimentieren, es ist jedoch unsicher. Es sollte eine Bedingung sein.(HttpWebRequest)WebRequest.Create(url)
ist vollkommen gültig, aber auf meiner Box ist sieHttpWebRequest.Create(url)
noch in einem Projekt vorhanden, das auf .Net 4.6.2 abzielt. Die Wahl des Küchenchefs, aber zu diesem ZeitpunktHttpClient
ist wahrscheinlich die bessere API zu verwenden.Das hat bei mir funktioniert:
Ausschnitt von hier: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors
quelle
Es gibt auch die kurze Delegatenlösung:
quelle
true
ist unsicher.Es wurde erwähnt, dass vor .NET 4.5 die Eigenschaft für die Anforderung des Zugriffs
ServicePointManager
nicht verfügbar war.Hier ist der .NET 4.0-Code, mit dem Sie
ServicePoint
pro Anfrage auf den zugreifen können . Sie erhalten keinen Zugriff auf den Rückruf pro Anforderung, sollten jedoch weitere Informationen zum Problem erhalten. Greifen Sie einfach auf die Eigenschaften zuscvPoint.Certificate
(oderClientCertificate
wenn Sie dies bevorzugen).quelle
ignore
ihnen nicht vertraut.ServicePoint
ich kann nicht immer allen SSL-Zertifikaten vertrauen und auch nicht alle Zertifikate ignorieren , da ich nichtServerCertificateValidationCallback
in ServicePointNur im Übrigen ist dies die am wenigsten ausführliche Methode, um alle Zertifikatsüberprüfungen in einer bestimmten App zu deaktivieren, von denen ich weiß:
quelle
Anstatt ServicePointManager einen Rückruf hinzuzufügen, der die Zertifikatsüberprüfung global überschreibt, können Sie den Rückruf für eine lokale Instanz von HttpClient festlegen. Dieser Ansatz sollte nur Aufrufe betreffen, die mit dieser Instanz von HttpClient getätigt wurden.
Hier ist ein Beispielcode, der zeigt, wie das Ignorieren von Zertifikatüberprüfungsfehlern für bestimmte Server in einem Web-API-Controller implementiert werden kann.
quelle
Basierend auf Adams Antwort und Robs Kommentar habe ich Folgendes verwendet:
was das "Ignorieren" etwas filtert. Natürlich können bei Bedarf weitere Emittenten hinzugefügt werden. Dies wurde in .NET 2.0 getestet, da wir älteren Code unterstützen müssen.
quelle
CA5386: Tools zur Analyse von Sicherheitslücken machen Sie auf diese Codes aufmerksam.
Richtiger Code:
quelle
Für .net Kern
quelle
Ausdrücklich ausgedrückt ...
quelle
Zusätzlich zu den Antworten von Sani und blak3r habe ich dem Startcode für meine Anwendung Folgendes hinzugefügt, jedoch in VB:
Scheint den Trick zu machen.
quelle
Tipp: Mit dieser Methode können Sie auch Zertifikate verfolgen, die bald ablaufen. Dies kann Ihren Speck retten, wenn Sie ein Zertifikat entdecken, das bald abläuft, und es rechtzeitig reparieren lassen. Gut auch für Drittunternehmen - für uns ist dies DHL / FedEx. DHL hat gerade ein Zertifikat ablaufen lassen, das uns 3 Tage vor Thanksgiving vermasselt. Zum Glück bin ich da, um das Problem zu beheben ... diesmal!
quelle
ProwlUtil.StepReached
?Mehrere Antworten oben funktionieren. Ich wollte einen Ansatz, bei dem ich nicht ständig Codeänderungen vornehmen musste und meinen Code nicht unsicher machte. Daher habe ich eine Whitelist erstellt. Die Whitelist kann in jedem Datenspeicher verwaltet werden. Ich habe die Konfigurationsdatei verwendet, da es sich um eine sehr kleine Liste handelt.
Mein Code ist unten.
quelle
Unity C # -Version dieser Lösung:
quelle