Umgehen Sie ungültige SSL-Zertifikatfehler, wenn Sie Webdienste in .Net aufrufen

87

Wir richten ein neues SharePoint ein, für das wir noch kein gültiges SSL-Zertifikat haben. Ich möchte den Lists-Webdienst aufrufen, um einige Metadaten zum Setup abzurufen. Wenn ich dies versuche, erhalte ich jedoch die Ausnahme:

Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden.

Die verschachtelte Ausnahme enthält die Fehlermeldung:

Das Remote-Zertifikat ist gemäß dem Validierungsverfahren ungültig.

Dies ist korrekt, da wir ein temporäres Zertifikat verwenden.

Meine Frage lautet: Wie kann ich den .Net-Webdienstclient ( SoapHttpClientProtocol ) anweisen , diese Fehler zu ignorieren?

jan.vdbergh
quelle

Antworten:

18

Bei diesem Problem habe ich den Unterzeichner des temporären Zertifikats zur Liste der vertrauenswürdigen Behörden auf dem betreffenden Computer hinzugefügt.

Normalerweise teste ich mit Zertifikaten, die mit CACERT erstellt wurden, und das Hinzufügen zu meiner Liste vertrauenswürdiger Behörden hat reibungslos funktioniert.

Wenn Sie dies auf diese Weise tun, müssen Sie Ihrer Anwendung keinen benutzerdefinierten Code hinzufügen, und es wird ordnungsgemäß simuliert, was bei der Bereitstellung Ihrer Anwendung passieren wird. Daher halte ich dies für eine überlegene Lösung, um die Prüfung programmgesteuert auszuschalten.

Simon Johnson
quelle
Das war auch meine erste Idee. Leider ist das Zertifikat ebenfalls abgelaufen, so dass es unmöglich ist, ihm zu vertrauen.
jan.vdbergh
Gibt es einen Grund, warum Sie jemanden wie CA cert nicht verwenden können? Wenn es sich um ein Testzertifikat handelt, können Sie einfach damit fortfahren. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, diese Schecks auszuschalten!
Simon Johnson
113

Alternativ können Sie einen Rückrufdelegierten registrieren, der den Zertifizierungsfehler ignoriert:

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}
Alex Bagnolini
quelle
1
Ich habe diese statische Methode zur Datei global.asax hinzugefügt und das Ereignis auf "OnApplicationStart" festgelegt. Lief wie am Schnürchen. Vielen Dank
Juan Zamora
1
@ JuanZamora Ich habe das gleiche getan, was du getan hast. Es funktionierte!
Sachin BR
5
Dies ist alles, was Sie tun müssen, wenn Sie für den Angriff "Mann in der Mitte" anfällig sein wollen ...
Houtman
2
Idealerweise sollten Sie dies nur in einer Entwicklungsumgebung tun.
Ron DeFreitas
79

Wie die Antwort von Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Ich füge dies in mein Main ein und schaue auf mein app.configund teste, ob ich diese (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")Codezeile aufrufe.

Keith Sirmons
quelle
24

Ich habe es so gelöst:

Rufen Sie kurz vor dem Aufruf Ihres SSL-Webservices Folgendes auf, das diesen Fehler verursacht:

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

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}
Iman
quelle
11

Ich hatte den gleichen Fehler bei der Verwendung von DownloadString. und konnte es wie unten mit Vorschlägen auf dieser Seite funktionieren lassen

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);
Dinesh Rajan
quelle
3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

wird invaild ssl umgehen. Schreiben Sie es an Ihren Webdienstkonstruktor.

hasanaydogar
quelle
1

Für Neulinge können Sie Ihre Teil-Service-Klasse in einer separaten CS-Datei erweitern und dem Code den von "imanabidi" bereitgestellten Code hinzufügen, um ihn zu integrieren

Senthil
quelle
1

Weitere Erweiterung von Simon Johnsons Beitrag - Idealerweise möchten Sie eine Lösung, die die Bedingungen simuliert, die Sie in der Produktion sehen, und das Ändern Ihres Codes funktioniert nicht und kann gefährlich sein, wenn Sie vergessen, den Code vor der Bereitstellung herauszunehmen.

Sie benötigen ein selbstsigniertes Zertifikat. Wenn Sie IIS Express verwenden, haben Sie bereits eines davon, Sie müssen es nur finden. Öffnen Sie Firefox oder einen beliebigen Browser und rufen Sie Ihre Entwickler-Website auf. Sie sollten in der Lage sein, die Zertifikatinformationen in der URL-Leiste anzuzeigen, und abhängig von Ihrem Browser sollten Sie in der Lage sein, das Zertifikat in eine Datei zu exportieren.

Öffnen Sie als Nächstes MMC.exe und fügen Sie das Zertifikat-Snap-In hinzu. Importieren Sie Ihre Zertifikatdatei in den Speicher für vertrauenswürdige Stammzertifizierungsstellen, und das ist alles, was Sie benötigen sollten. Es ist wichtig sicherzustellen, dass es in dieses Geschäft geht und nicht in ein anderes Geschäft wie "Personal". Wenn Sie mit MMC oder Zertifikaten nicht vertraut sind, gibt es zahlreiche Websites mit Informationen dazu.

Jetzt vertraut Ihr Computer als Ganzes implizit allen Zertifikaten, die er selbst generiert hat, und Sie müssen keinen Code hinzufügen, um dies speziell zu handhaben. Wenn Sie zur Produktion wechseln, funktioniert es weiter, vorausgesetzt, Sie haben dort ein ordnungsgemäßes gültiges Zertifikat installiert. Tun Sie dies nicht auf einem Produktionsserver - das wäre schlecht und funktioniert nicht für andere Clients als die auf dem Server selbst.

Nigel Thomas
quelle