Ich habe einen einfachen Webdienstaufruf, der von einer .NET (C #) 2.0-Windows-App über den von Visual Studio generierten Webdienst-Proxy für einen ebenfalls in C # (2.0) geschriebenen Webdienst generiert wird. Dies funktioniert seit mehreren Jahren und wird auch weiterhin an etwa einem Dutzend Orten durchgeführt, an denen es ausgeführt wird.
Bei einer Neuinstallation an einem neuen Standort tritt ein Problem auf. Beim Versuch, den Webdienst aufzurufen, schlägt die folgende Meldung fehl:
Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden
Die URL des Webdienstes verwendet SSL (https: //) - dies funktioniert jedoch seit langem (und wird auch weiterhin) von vielen anderen Standorten aus.
Wo schaue ich Könnte dies ein Sicherheitsproblem zwischen Windows und .NET sein, das nur bei dieser Installation auftritt? Wenn ja, wo richte ich Vertrauensbeziehungen ein? Ich bin verloren!
Antworten:
Gedanken (basierend auf Schmerzen in der Vergangenheit):
Serverdie Uhr richtig eingestellt (dh die UTC-Zeit ist korrekt [Ortszeit ignorieren, sie spielt keine Rolle]) - dies ist sicherlich für WCF von Bedeutung und kann sich daher auf die reguläre SOAP auswirken.quelle
Die folgenden Snippets beheben den Fall, dass mit dem SSL-Zertifikat auf dem Server, den Sie anrufen, ein Fehler vorliegt. Beispielsweise kann es selbstsigniert sein oder der Hostname zwischen dem Zertifikat und dem Server stimmt möglicherweise nicht überein.
Dies ist gefährlich, wenn Sie einen Server außerhalb Ihrer direkten Kontrolle anrufen, da Sie nicht mehr so sicher sein können, dass Sie mit dem Server sprechen, mit dem Sie verbunden sind. Wenn Sie jedoch mit internen Servern zu tun haben und es nicht praktikabel ist, ein "korrektes" Zertifikat zu erhalten, verwenden Sie die folgenden Anweisungen, um den Webdienst anzuweisen, die Zertifikatprobleme zu ignorieren und mutig zu arbeiten.
Die ersten beiden verwenden Lambda-Ausdrücke, die dritte verwendet regulären Code. Der erste akzeptiert jedes Zertifikat. Die letzten beiden überprüfen mindestens, ob der Hostname im Zertifikat der erwartete ist.
... hoffe du findest es hilfreich
quelle
ServicePointManager.ServerCertificateValidationCallback = null;
sollte zum Standardverhalten zurückkehren.Die sehr einfache "catch all" -Lösung lautet:
Die Lösung von Sebastian-Castaldi ist etwas detaillierter.
quelle
#If CONFIG = "Debug"
Anweisung eingefügt, damit es nur im Debug-Modus aktiviert wird. Es funktioniert super!Ich persönlich mag die folgende Lösung am meisten:
... bevor Sie den Fehler anfordern, gehen Sie wie folgt vor
Fand dies nach Rücksprache mit Luke's Solution
quelle
Wenn Sie Windows 2003 verwenden, können Sie Folgendes versuchen:
Referenz: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...
quelle
Wenn Sie nicht jedem blind vertrauen und nur für bestimmte Hosts eine Vertrauensausnahme machen möchten, ist die folgende Lösung besser geeignet.
Rufen Sie dann einfach Ssl.EnableTrustedHosts auf, wenn Ihre App gestartet wird.
quelle
Luke hat einen ziemlich guten Artikel darüber geschrieben. Ganz einfach. Probieren Sie es aus
Lukes Lösung
Grund (Zitat aus seinem Artikel (minus Fluchen)) ".. Das Problem mit dem obigen Code ist, dass es nicht funktioniert, wenn Ihr Zertifikat nicht gültig ist. Warum sollte ich auf einer Webseite mit und ungültigem SSL-Zertifikat posten? Weil Ich bin billig und hatte keine Lust, Verisign oder einen der anderen ** - * für ein Zertifikat an meine Testbox zu bezahlen, also habe ich es selbst unterschrieben. Als ich die Anfrage schickte, wurde mir eine schöne Ausnahme zugeworfen:
System.Net.WebException Die zugrunde liegende Verbindung wurde geschlossen. Es konnte keine Vertrauensbeziehung zum Remoteserver hergestellt werden.
Ich weiß nichts über dich, aber für mich sah diese Ausnahme wie etwas aus, das durch einen dummen Fehler in meinem Code verursacht wurde, der dazu führte, dass der POST fehlschlug. Also suchte ich weiter und optimierte und machte alle möglichen seltsamen Dinge. Erst nachdem ich das *** n-Ding gegoogelt hatte, stellte ich fest, dass das Standardverhalten nach dem Auftreten eines ungültigen SSL-Zertifikats darin besteht, genau diese Ausnahme auszulösen. .. "
quelle
Das SSL-Diagnosetool von Microsoft kann möglicherweise zur Identifizierung des Problems beitragen.
UPDATE Der Link wurde jetzt behoben.
quelle
Ich bin gerade auf dieses Problem gestoßen. Mein Vorsatz war es, die Systemzeit durch manuelle Synchronisierung mit den Zeitservern zu aktualisieren. Dazu können Sie:
Adjust Date/Time
Internet Time
RegisterkarteChange Settings
Update Now
In meinem Fall wurde dies falsch synchronisiert, sodass ich mehrmals darauf klicken musste, bevor es korrekt aktualisiert wurde. Wenn die Aktualisierung weiterhin nicht korrekt durchgeführt wird, können Sie sogar versuchen, einen anderen Zeitserver als das Server-Dropdown-Menü zu verwenden.
quelle
Versuche dies:
Beachten Sie, dass Sie mindestens mit 4.5 .NET Framework arbeiten müssen
quelle
Ich hatte ein ähnliches Problem in der
.NET
App im Internet Explorer.Ich habe das Problem beim Hinzufügen des Zertifikats (in meinem Fall VeriSign Class 3-Zertifikat) zu Zertifikaten vertrauenswürdiger Editoren gelöst.
Sie können das Zertifikat erhalten, wenn Sie es exportieren von:
Vielen Dank
quelle
Ich hatte diesen Fehler auf einem Webserver mit einer URL wie:
Da es jedoch kein Zertifikat dafür gab, wurde ein DNS aufgerufen
Ich möchte hier nur einen Hinweis auf diese Lösung geben, da dies in Google ganz oben stand.
quelle
Für diejenigen, die dieses Problem über eine VS-Clientseite haben, nachdem sie erfolgreich eine Dienstreferenz hinzugefügt und versucht haben, den ersten Aufruf auszuführen, wurde die folgende Ausnahme angezeigt: "Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden." Wenn Sie (wie in meinem Fall) eine Endpunkt-URL mit der IP-Adresse verwenden und diese Ausnahme erhalten haben, müssen Sie wahrscheinlich die Dienstreferenz erneut hinzufügen, indem Sie die folgenden Schritte ausführen:
Versuch es noch einmal :). Vielen Dank
quelle
In meinem Fall habe ich versucht, SSL in meiner Visual Studio-Umgebung mit IIS 7 zu testen .
Folgendes habe ich getan, um es zum Laufen zu bringen:
Unter meiner Site im Abschnitt 'Bindungen ...' rechts in IIS musste ich die 'https'-Bindung zu Port 443 hinzufügen und "IIS Express-Entwicklungszertifikat" auswählen.
Unter meiner Website im Abschnitt "Erweiterte Einstellungen ..." auf der rechten Seite musste ich die "Aktivierten Protokolle" von "http" in "https" ändern.
Unter dem Symbol "SSL-Einstellungen" habe ich "Akzeptieren" für Client-Zertifikate ausgewählt.
Dann musste ich den App-Pool recyceln.
Ich musste auch das lokale Host-Zertifikat mit mmc.exe in meinen persönlichen Shop importieren.
Meine
web.config
Datei war bereits korrekt konfiguriert, und nachdem ich alle oben genannten Punkte erledigt hatte, konnte ich meine Tests fortsetzen.quelle
Meine Lösung (VB.Net, die "Staging" (UAT) -Version dieser Anwendung muss mit dem "Staging" -Zertifikat arbeiten, aber keine Auswirkungen auf Anforderungen haben, sobald sie sich auf der Live-Site befinden):
quelle
Wenn nicht, funktioniert schlechtes Sertifikat, wenn ServerCertificateValidationCallback true zurückgibt; Mein ServerCertificateValidationCallback-Code:
Mein Code, den ServerCertificateValidationCallback verhindert hat:
OnValidateCertificateError-Funktion:
Ich habe den CertificateValidation-Code deaktiviert und ServerCertificateValidationCallback läuft sehr gut
quelle