it-swarm.com.de

Wie ignoriere ich die Zertifikatsüberprüfung, wenn ssl

Ich versuche einen Weg zu finden, um die Zertifikatüberprüfung zu ignorieren, wenn eine Https-Ressource angefordert wird. Bisher fand ich im Internet einen hilfreichen Artikel. 

Aber ich habe immer noch Probleme. 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, wo soll ich diesen Code schreiben? Vor ServicePointManager.ServerCertificateValidationCallback ausführen oder vor 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;
    }
}   
112
Joe.wang

Da es nur einen globalen ServicePointManager gibt, führt die Einstellung 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 das Festlegen des Rückrufs wird das Standardverhalten überschrieben. Sie können selbst eine benutzerdefinierte Überprüfungsroutine erstellen. 

62

Für alle, die diese Lösung auf Anfrage anwenden möchten, ist dies eine Option, die einen Lambda-Ausdruck verwendet. Der gleiche Lambda-Ausdruck kann auch auf den von blak3r genannten globalen Filter angewendet werden. Diese Methode scheint .NET 4.5 zu erfordern.

String url = "https://www.stackoverflow.com";
HttpWebRequest request = HttpWebRequest.CreateHttp(url);
request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

In .NET 4.0 kann der Lambda-Ausdruck als solcher auf den globalen Filter angewendet werden

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
146
Adam Venezia

Das hat für mich funktioniert:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                        System.Security.Cryptography.X509Certificates.X509Chain chain,
                        System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        return true; // **** Always accept
    };

Ausschnitt von hier: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors

48
blak3r

Es gibt auch die kurze Lösung für Delegierte:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
19
Andrej Rommel

Es wurde erwähnt, dass vor .NET 4.5 die Eigenschaft für die Anforderung zum Zugriff auf die Variable ServicePointManager nicht verfügbar war.

Hier ist .NET 4.0-Code, mit dem Sie auf Anfrage die ServicePoint aufrufen können. Sie haben keinen Zugriff auf den Rückruf pro Anforderung, aber Sie sollten mehr Informationen über das Problem erhalten. Greifen Sie einfach auf die Eigenschaften von scvPoint.Certificate (oder ClientCertificate) zu.

WebRequest request = WebRequest.Create(uri);

// oddity: these two .Address values are not necessarily the same!
//  The service point appears to be related to the .Host, not the Uri itself.
//  So, check the .Host vlaues before fussing in the debugger.
//
ServicePoint svcPoint = ServicePointManager.FindServicePoint(uri);
if (null != svcPoint)
{
    if (!request.RequestUri.Host.Equals(svcPoint.Address.Host, StringComparison.OrdinalIgnoreCase))
    {
        Debug.WriteLine(".Address              == " + request.RequestUri.ToString());
        Debug.WriteLine(".ServicePoint.Address == " + svcPoint.Address.ToString());
    }
    Debug.WriteLine(".IssuerName           == " + svcPoint.Certificate.GetIssuerName());
}
5
Jesse Chisholm

Übrigens ist dies die am wenigsten ausführliche Methode, um alle Zertifikatsüberprüfungen in einer bestimmten App zu deaktivieren, die mir bekannt ist:

ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;
3

Basierend auf Adams Antwort und Robs Kommentar habe ich Folgendes verwendet:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => certificate.Issuer == "CN=localhost";

was das "Ignorieren" etwas filtert. Andere Aussteller können natürlich nach Bedarf hinzugefügt werden .. Dies wurde in .NET 2.0 getestet, da wir etwas älteren Code unterstützen müssen.

2
Andrej

Ausdrücklich ausgedrückt ...

ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(CertCheck);

private static bool CertCheck(object sender, X509Certificate cert,
X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
    return true;
}
1
dev_O

CA5386: Tools zur Schwachstellenanalyse weisen Sie auf diese Codes hin.

Richtiger Code:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
{
   return (sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) != SslPolicyErrors.RemoteCertificateNotAvailable;
};
0
dev_O

Anstatt einen Rückruf zu ServicePointManager 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 ausgeführt werden.

Beispielcode zeigt, wie das Ignorieren von Zertifikatsüberprüfungsfehlern für bestimmte Server in einem Web-API-Controller implementiert werden kann.

using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

public class MyController : ApiController
{

    // use this HttpClient instance when making calls that need cert errors suppressed
    private static readonly HttpClient httpClient;

    static MyController()
    {
        // create a separate handler for use in this controller
        var handler = new HttpClientHandler();

        // add a custom certificate validation callback to the handler
        handler.ServerCertificateCustomValidationCallback = ((sender, cert, chain, errors) => ValidateCert(sender, cert, chain, errors));

        // create an HttpClient that will use the handler
        httpClient = new HttpClient(handler);
    }

    protected static ValidateCert(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors)
    {

        // set a list of servers for which cert validation errors will be ignored
        var overrideCerts = new string[]
        {
            "myproblemserver",
            "someotherserver",
            "localhost"
        };

        // if the server is in the override list, then ignore any validation errors
        var serverName = cert.Subject.ToLower();
        if (overrideCerts.Any(overrideName => serverName.Contains(overrideName))) return true;

        // otherwise use the standard validation results
        return errors == SslPolicyErrors.None;
    }

}
0
Sheldon

Tipp: Sie können diese Methode auch verwenden, um Zertifikate zu verfolgen, die bald ablaufen. Dies kann Ihren Speck retten, wenn Sie ein Zertifikat entdecken, das bald abläuft, und es rechtzeitig beheben kann. Gut auch für Fremdfirmen - für uns DHL/FedEx. DHL lässt nur ein Zertifikat auslaufen, das uns 3 Tage vor Thanksgiving vermasselt. Zum Glück bin ich hier, um das Problem zu beheben ... diesmal!

    private static DateTime? _nextCertWarning;
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
    {
        if (error == SslPolicyErrors.None)
        {
            var cert2 = cert as X509Certificate2;
            if (cert2 != null)
            { 
                // If cert expires within 2 days send an alert every 2 hours
                if (cert2.NotAfter.AddDays(-2) < DateTime.Now)
                {
                    if (_nextCertWarning == null || _nextCertWarning < DateTime.Now)
                    {
                        _nextCertWarning = DateTime.Now.AddHours(2);

                        ProwlUtil.StepReached("CERT EXPIRING WITHIN 2 DAYS " + cert, cert.GetCertHashString());   // this is my own function
                    }
                }
            }

            return true;
        }
        else
        {
            switch (cert.GetCertHashString())
            {
                // Machine certs - SELF SIGNED
                case "066CF9CAD814DE2097D367F22D3A7E398B87C4D6":    

                    return true;

                default:
                    ProwlUtil.StepReached("UNTRUSTED CERT " + cert, cert.GetCertHashString());
                    return false;
            }
        }
    }
0
Simon_Weaver

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 Datastore verwaltet werden. Ich habe die Konfigurationsdatei verwendet, da es sich um eine sehr kleine Liste handelt.

Mein Code ist unten.

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => {
    return error == System.Net.Security.SslPolicyErrors.None || certificateWhitelist.Contains(cert.GetCertHashString());
};
0
Osa E

Neben den Antworten von Sani und blak3r habe ich dem Startcode für meine Anwendung Folgendes hinzugefügt, jedoch in VB:

'** Overriding the certificate validation check.
Net.ServicePointManager.ServerCertificateValidationCallback = Function(sender, certificate, chain, sslPolicyErrors) True

Scheint den Trick zu tun.

0
MCattle