WCF-Fehler "Dies kann daran liegen, dass das Serverzertifikat im HTTPS-Fall nicht ordnungsgemäß mit HTTP.SYS konfiguriert ist."


79

Ich habe ein Problem bei der Verwendung eines WCF-Aufrufs von einem Windows-Dienst an meinen WCF-Dienst, der auf meinem Webserver ausgeführt wird. Dieser Anruf funktioniert seit einigen Wochen, funktioniert dann aber plötzlich nicht mehr und hat seitdem nicht mehr funktioniert.

Die Ausnahme, die ich bekomme, ist:

Allgemeiner Fehler aufgetreten System.ServiceModel.CommunicationException: Beim Ausführen der HTTP-Anforderung ist ein Fehler aufgetreten

und dann heißt es

Dies kann daran liegen, dass das Serverzertifikat im HTTPS-Fall nicht ordnungsgemäß mit HTTP.SYS konfiguriert ist. Dies kann auch durch eine Nichtübereinstimmung der Sicherheitsbindung zwischen Client und Server verursacht werden.

Die Sicherheit, die ich an beiden Enden verwende, ist wsHttpBinding ohne jegliche Verschlüsselung. Es wird auch nur HTTP verwendet - nicht HTTPS, daher bin ich mir nicht sicher, warum es sich über HTTPS beschwert.

Der Rest des inneren Ausnahmestapels ist:

SystemNet.WebException: Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten. ---> System.IO.IOException: Daten können nicht in die Transportverbindung geschrieben werden: Es wurde ein ungültiges Argument angegeben. ---> System.Net.Sockets.SocketException: Bei System.Net.Sockets.Socket.MultipleSend (BufferOffsetSize [] -Puffer, SocketFlags-SocketFlags) bei System.Net.Sockets.NetworkStream.MultipleWrite (BufferOffsetSize] wurde ein ungültiges Argument angegeben Puffer)

Ich sollte auch beachten, dass der Punkt in meinem Programm, an dem dies auftritt, in der Zeile "Ausführen" des Aufrufs des Webdienstes liegt - das heißt, sobald ich den Webdienst aufrufe und ihm das verpackte DataContract-Objekt übergebe in die Luft sprengen.

Alles, was dieser Dienst tut, ist die Übergabe einer großen Menge an XML (als .NET-Objekt an den Aufruf auf der Clientseite übergeben), mit der er dann einige Arbeiten ausführt. Wahrscheinlich werden ungefähr 100-200k XML übertragen. Ich habe die Grenzwerte für die Datengrößen an beiden Enden auf über 6 Megabyte erhöht, aber das schien nicht zu helfen.

Irgendwelche Ideen?


Weitere Informationen zu diesem Thema:

Wenn wir die Client-Umgebung lokal duplizieren, stellen wir fest, dass wir keine großen Mengen an XML hochladen können, wenn wir nicht die folgenden Änderungen vornehmen: 1. Setzen Sie auf dem Server die "maxRequestLength" auf 100 MB (viel höher als beim Senden). 2. Ein Im Client setzen wir den Wert von maxItemsInObjectGraph unter dem Tag dataContractSerializer auf "2147483646".

Mit diesen Änderungen wird unsere lokale Installation erfolgreich hochgeladen. Die Installation des Clients auf seinem Server schlägt jedoch weiterhin fehl. Interessant ist, dass unsere Testinstallation nach der Änderung des Werts für maxRequestLength auf dem Server einen Fehler auslöste, der sich speziell auf die Einstellung maxItemsInObjectGraph bezog. Während auf dem Server unseres Clients immer noch der ursprüngliche Fehler "HTTP.sys" auftritt.

Wie bereits erwähnt, verwenden wir überhaupt kein SSL, und es gibt zwei weitere Webdienstaufrufe, die XML auf dieselbe Weise ausführen und hochladen. Da der nicht funktionierende Serviceabruf jedoch mehr Daten überträgt, scheint dies ein Größenproblem zu sein.

Wenn jedoch das Problem, das der Client hat, das gleiche war, das unsere Testinstallation hatte, verstehe ich nicht, warum die Client-Fehlermeldung nicht mit dem ObjectGraph-Fehler zusammenhängt.

Ist es möglich, dass wir nur den generischen Fehler "Ungültiger Parameter" "HTTP.sys" für jeden möglichen Fehler auf dem Client erhalten (dh es wird wirklich auch der Fehler objectGraph angezeigt, aber nur nicht angezeigt?)


Sie sagen, es funktioniert nicht mehr. Hat sich Code oder Konfiguration geändert, die möglicherweise dafür verantwortlich waren? Können Sie Code für die Methode, die Sie aufrufen, mit Datentypen veröffentlichen, die übergeben werden?
Tanner

Ich werde das ausgraben und posten. Ich denke, ich übergebe im Grunde ein Array von "AppointmentData" -Objekten, die im DataContract-Material definiert sind. Sicherlich komplexe Objekte, also werde ich Ihren Beitrag überprüfen. Vielen Dank!
Sam Schutte

Oh, und kein Code oder keine Konfiguration wurde geändert - hat wochenlang gut funktioniert und dann einfach aufgehört. Es ist möglich, dass auch die Firewall-Einstellungen des Clients geändert wurden, aber was seltsam ist, ist, dass der Dienst, der den WCF-Aufruf ausführt, zwei andere WCF-Dienstmethoden aufrufen kann und auch die Möglichkeit hat, mir eine E-Mail mit dem Ausnahmeinhalt zu senden bei 2 der 3 WCF-Anrufe, aber nicht beim letzten.
Sam Schutte

2
Ich bin immer misstrauisch gegenüber "allgemeinen Fehlern", die dann eine Möglichkeit vorschlagen, weil Sie nicht wirklich wissen, ob der Vorschlag ein roter Hering ist oder nicht. Können Sie testen, indem Sie die Sicherheit = none setzen? Wenn der Serviceabruf funktioniert, wird uns mitgeteilt, dass das Zertifikat (oder zumindest die Sicherheit) ein Problem darstellt. Ich würde auch gerne die Konfiguration auf beiden Seiten sehen.
Mike L

Ich muss nachsehen, aber ich bin mir ziemlich sicher, dass die Sicherheit bereits auf keine eingestellt ist ...
Sam Schutte

Antworten:


73

Wir hatten dieses Problem, da der Hostserver für die Verwendung von TLS V1.2 aktualisiert wurde und wir eine Verbindung mit Standard-SSL herstellten. Dies war ein Update, das im Rahmen von Pen-Tests der Websites durchgeführt wurde. Wir haben das Problem in der Codeverbindung gesehen, aber keine Browser, die zur WSDL gehen. Der folgende Code wurde behoben:

if (System.Net.ServicePointManager.SecurityProtocol == (SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls))
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Von hier aus: Wie deaktiviere ich den SSL-Fallback und verwende nur TLS für ausgehende Verbindungen in .NET? (Pudelminderung)


Vielen Dank! Das hat mir geholfen. Ich musste dies einstellen, wenn ich eine C # -DLL aufrief, die SOAP von einer C ++ - App aus aufrief. Wenn dieselbe C # -DLL von der C # -App aufgerufen wurde, wurde dies nicht benötigt.
Pixel

in meinem Fall: a) Ich musste using System.Netmeiner Datei hinzufügen . b) Der Wert von SecurityProtocol war "Standard". Ich habe beschlossen, das "if" zu entfernen und SecurityProtocolType.Tls | zuzuweisen SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 ohne vorher zu fragen. HTH, Marcelo
Marcelo Finki

1
2020. Gleiche Lösung.
Anton Krouglov

27

Ich hatte das gleiche Problem bei einem Dienst, der unter IIS 7 ausgeführt wird. Der Dienst stellt beim Hinzufügen eines neuen Servers (einige SSL, andere nicht) eine Verbindung zu mehreren Anbieterservern her (dieser neue Anbieter war TLS 1.2). Nach einigen Anfragen wurde der Fehler angezeigt auf den ursprünglichen Servern (SSL) gemacht.

Um dies zu bestätigen, habe ich einfach System.Net.ServicePointManager.SecurityProtocolvor jeder Anfrage bei jedem Lieferanten protokolliert .

Niedrig und siehe da, nach dem Neustart des Dienstes (oder nach dem Neustart des Anwendungspools) würde ich die Ausgabe erhalten, Ssl3, Tlsaber nach einigen Anfragen an die ursprünglichen Lieferantenserver wurde dies geändert Ssl3und Anfragen an den TLS-Dienst gaben den Fehler.

Um das Problem zu beheben, habe ich einfach das getan, was user369142 vorgeschlagen hat. Vor jeder Anfrage an den neuen Server:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

und keine fehler mehr.


Sie benötigen mindestens .NET 4.5+, um TLS 1.2+ verwenden zu können. Quelle: blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
xx1xx

Vielen Dank, könnte es stattdessen mit Ganzzahlen für die Aufzählung verwendet werden: System.Net.ServicePointManager.SecurityProtocol = 123 => enum1 | enum2 usw. Für andere Frameworks?
MirlvsMaximvs

Sie müssen dies nicht vor jeder Anforderung festlegen - legen Sie es nur einmal im Anwendungsstartereignis fest - es ist eine statische Eigenschaft, die Sie festlegen.
user369142

9

Hatte dieses Problem mit einer echten HTTPS-Bindung und der gleichen Ausnahme mit "Dies könnte daran liegen, dass das Serverzertifikat im HTTPS-Fall nicht ordnungsgemäß mit HTTP.SYS konfiguriert ist ...". Nachdem wir alles in Code und Konfiguration überprüft haben, scheint die Fehlermeldung nicht so irreführend zu sein wie die inneren Ausnahmen. Nach einer kurzen Überprüfung haben wir festgestellt, dass der Port 443 über Skype (auf dem Dev-Server) angeschlossen war. Ich empfehle Ihnen, einen Blick darauf zu werfen, was die Anfrage aufhält (Fiddler könnte hier helfen) und sicherzustellen, dass Sie die Service-Front (siehe .svc in Ihrem Browser) und deren Metadaten erreichen.

Viel Glück.


9

In meinem Fall musste ich SchUseStrongCrypto.Net aktivieren. Dies zwingt den Server, eine Verbindung mit TLS 1.0, 1.1 oder 1.2 herzustellen. OhneSchUseStrongCrypto Aktivierung versuchte die Verbindung, SSL 3.0 zu verwenden, das auf meinem Remote-Endpunkt deaktiviert war.

Registrierungsschlüssel, um die Verwendung einer starken Krypto zu ermöglichen:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

6

Für uns war dieser Fehler darauf zurückzuführen, dass auf dem Computer des Entwicklers, auf dem der Dienst ausgeführt wird, IIS so konfiguriert war, dass Port 443 nur auf 127.0.0.1 gebunden wird.

Klicken Sie im IIS-Manager mit der rechten Maustaste auf die Website und wählen Sie Bindungen bearbeiten. Wenn der Eintrag für Port 443eine IP-Adresse hat 127.0.0.1, ändern Sie diese in *.


5

Nachdem ich viel gesucht und den Namen des Lords vergeblich genommen hatte, bekam ich ihn endlich. Ich habe TLS 1.2 auf dem Server installiert, auf dem mein wcf-Dienst ausgeführt wird. Mein Client wurde korrekt konfiguriert, aber er wurde auf .NET 4.5.1 erstellt, während der wcf war unter .NET 4.6.1. Sowohl Client als auch Server müssen dieselbe .NET-Version haben, wenn Sie TLS 1.2 verwenden. Ich hoffe es hilft irgendwann jemandem :-)


2
Dies müsste ein Fehler sein, wenn dies der Fall wäre. Das Protokoll sollte sich nicht je nach .NET-Version unterscheiden, ganz zu schweigen von Diensten oder Clients, die nicht einmal .NET verwenden.
Joel McBeth

Dieser Hinweis löste mein Problem. Ich hatte ein WPF-Projekt mit einem Verweis auf ein anderes Projekt B. Projekt B war 4.5.2 und das WPF-Projekt war 4.6.1. Mit beiden 4.5.2 wurde das Problem gelöst.
Ignacio Hagopian

5

Ändern Sie Ihre Client-Anwendung auf 4.5 und höher. Wenn Sie 4.5 sind, verwenden Sie: System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 / Tls1.1 / Tls1.0 nach Bedarf, oder Sie können Ihre Anwendung auf über 4.6.1 aktualisieren.


4

In letzter Zeit trat fast genau das gleiche Problem auf, das durch die Installation des Microsoft-Updates KB980436 ( http://support.microsoft.com/KB/980436 ) auf dem aufrufenden Computer verursacht wurde. Abgesehen von der vollständigen Deinstallation haben wir die Anweisungen auf der KB-Site befolgt, um das UseScsvForTls-DWORD in der Registrierung auf 1 zu setzen. Wenn Sie sehen, dass dieses Update in Ihrem aufrufenden System installiert ist, können Sie es ausprobieren .


Haben Ihre Anrufe HTTPS verwendet? Oder waren sie als OPs unverschlüsselt?
Roufamatic

3

Ich hatte dieses Problem beim Ausführen älterer XP SP3-Boxen gegen IIS und Glassfish unter Amazon AWS. Amazon hat die Standardeinstellungen für den Load Balancer so geändert, dass die DES-CBC3-SHA-Verschlüsselung NICHT aktiviert wird. Sie müssen dies auf Amazon ELB aktivieren, wenn Sie älteren XP TLS 1.0 erlauben möchten, gegen ELB für HTTPS zu arbeiten. Andernfalls wird dieser Fehler angezeigt. Chiffren können in ELB geändert werden, indem Sie in der Konsole auf die Registerkarte Listener gehen und neben dem Listener, den Sie zum Laufen bringen möchten, auf Chiffre klicken.


2

Wenn Ihr WCF-Dienst .net Framework 4.0 verwendet und jemand TLS 1.0 auf dem Server deaktiviert hat, wird diese Ausnahme angezeigt. Aufgrund von .net 4.0 werden die höheren Versionen von TLS nicht unterstützt.

Unterstützte Protokolle: https://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.100).aspx


4
Tatsächlich gibt es eine Problemumgehung, die Sie weiterhin verwenden können: ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2und die unter NET 4.0 funktioniert.
F34R

@ F34R Ihr Kommentar hat mein Problem für eine .NET 4.0-App gelöst, die versucht, eine SOAP-Anforderung an einen Endpunkt zu senden, der kürzlich von http in https konvertiert wurde. Unterstützt von blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
Wesley Musgrove

1

Ich habe diese besonderen Ausnahmen im Zusammenhang mit komplexen DataType-Problemen gesehen. Weitere Informationen finden Sie im folgenden Beitrag, wenn Sie Sammlungen oder Aufzählungen weitergeben:

Komplexe Datentypen


Wir haben uns mit dem Datentypproblem befasst - wir senden nur einfache alte .NET-Objekte, die in unserem Datenvertrag definiert sind - keine Aufzählungen oder ähnliches. Wir haben einige der in diesem Artikel erwähnten Debug-Tracing-Tools installiert und konnten sehen, dass unsere zwei funktionierenden Aufrufe eingehen, aber für den dritten "nicht funktionierenden" Aufruf wurde überhaupt nichts angezeigt. Dies zeigt mir an, dass es überhaupt nicht vom Client-Computer kommt.
Sam Schutte

4
@ SamSchutte: Wurde dieser Fehler jemals behoben? Könnten Sie bitte angeben, was die Lösung war?
VoodooChild

1

Wenn Sie den Übertragungsmodus = gestreamt verwenden, ändern Sie ihn in gepuffert.

Wenn dies nicht das Problem ist, können Sie Ihre Konfiguration veröffentlichen.


1

Da alles wochenlang gut funktionierte und dann aufhörte, bezweifle ich, dass dies irgendetwas mit Ihrem Code zu tun hat. Möglicherweise tritt der Fehler auf, wenn der Dienst aktiviert wird in IIS / ASP.NET , nicht, wenn Ihr Code aufgerufen wird. Die Laufzeit könnte lediglich darin bestehen, die Konfiguration der Website zu überprüfen und eine allgemeine Fehlermeldung auszulösen, die nichts mit dem Dienst zu tun hat.

Mein Verdacht ist, dass ein Zertifikat abgelaufen ist oder dass die Bindungen falsch eingerichtet sind. Wenn die Website für HTTPS falsch konfiguriert ist, unabhängig davon, ob Ihr Code sie verwendet oder nicht, wird möglicherweise dieser Fehler angezeigt.


1

Versuchen Sie, den Dienst im Browser und im HTTP-Modus zu durchsuchen. Wenn er nicht durchsuchbar ist, ist dies der Grund für diesen Fehler. Um diesen Fehler zu beheben, müssen Sie Folgendes überprüfen:

  • https-Port, prüfen Sie, ob er nicht von anderen Ressourcen verwendet wird (Website)
  • Überprüfen Sie, ob das Zertifikat für https ordnungsgemäß konfiguriert ist oder nicht (überprüfen Sie die Signaturberechtigung, das selbstsignierte Zertifikat und verwenden Sie mehrere Zertifikate).
  • Überprüfen Sie die Bindung und Konfiguration des WCF-Dienstes für den HTTP-Modus

1

Unser Problem war einfach, dass die Portnummer auf dem Endpunkt fälschlicherweise auf 8080 eingestellt war. Sie wurde in 8443 geändert und funktionierte.


1

Anstatt das Sicherheitsprotokoll explizit festzulegen, ist es besser, die Datei web.config <compilation targetFramework = "4.5"> oder höher festzulegen.


1

Ich habe mein Problem gelöst, indem ich meine .NetFramework-Version von 4.5.2 auf 4.7.2 aktualisiert habe.


0

Erst kürzlich erlebt dies:

System.ServiceModel.CommunicationException:

Beim Senden der HTTP-Anforderung an http://example.com/WebServices/SomeService.svc ist ein Fehler aufgetreten . Dies kann daran liegen, dass das Serverzertifikat im HTTPS-Fall nicht ordnungsgemäß mit HTTP.SYS konfiguriert ist. Dies kann auch durch eine Nichtübereinstimmung der Sicherheitsbindung zwischen Client und Server verursacht werden.

---> System.Net.WebException: Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.

---> System.IO.IOException: Daten können nicht in die Transportverbindung geschrieben werden: Eine vorhandene Verbindung wurde vom Remote-Host zwangsweise geschlossen.

Ich habe von einem Administrator erfahren, dass der IIS-Anwendungspool, in dem der Webdienst gehostet wurde, automatisch wiederverwendet wird, nachdem nicht genügend Speicher vorhanden ist. Der Fehler auf dem Client trat auf, als der Anwendungspool wiederverwendet wurde.

Durch Erhöhen des für den Anwendungspool verfügbaren Speichers wurde das unmittelbare Problem behoben.


0

Unsere Anwendungen wurden kürzlich über ein Betriebssystem-Update der Network Appliance (F5) von SSL zu TLS gezwungen. Wir haben diesen Fehler behoben, indem wir die selbstsignierten Zertifikate neu generiert haben. Ich hoffe, dies hilft jemandem in Zukunft, das Problem zu beheben, da wir mehrere Wartungsfenster zur Fehlerbehebung aufgewendet haben, bevor wir zur Lösung gekommen sind.


0

Erst kürzlich erlebt dies:

System.ServiceModel.CommunicationException:

Beim Senden der HTTP-Anforderung an http://example.com/WebServices/SomeService.svc ist ein Fehler aufgetreten . Dies kann daran liegen, dass das Serverzertifikat im HTTPS-Fall nicht ordnungsgemäß mit HTTP.SYS konfiguriert ist. Dies kann auch durch eine Nichtübereinstimmung der Sicherheitsbindung zwischen Client und Server verursacht werden.

---> System.Net.WebException: Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.

---> System.IO.IOException: Daten können nicht in die Transportverbindung geschrieben werden: Eine vorhandene Verbindung wurde vom Remote-Host zwangsweise geschlossen.

Unsere Lizenz für den Bluecoat-Proxy ist abgelaufen! es war also nicht möglich, die externe Partei (Internet) zu erreichen.


0

Wir hatten das gleiche Problem und in unserem Fall wurde es behoben, indem das Zertifikat neu installiert und die Bindung erneut erstellt wurde. Was uns dorthin führte, war die Tatsache, dass selbst das Abrufen einer einfachen PNG-Bilddatei auf der Website den gleichen Fehler verursacht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.