Ich habe in der letzten Woche mit der Konfiguration für diesen veralteten WCF-Dienst zu kämpfen gehabt, und ich verspüre langsam den Verdacht, dass das, was ich versuche, trotz der Dokumentation einfach nicht möglich ist.
Ganz einfach: Ich möchte, dass ein WCF-Dienst ein Client-Zertifikat benötigt (das der Server in seinem Zertifikatspeicher hat), und dann auf diese Identität mit System.ServiceModel.ServiceSecurityContext zugreifen. Darüber hinaus muss die Transportsicherheit verwendet werden.
Hier ist meine Serverkonfiguration:
%Vor%Hier ist meine Client-Konfiguration:
%Vor%Der Code funktioniert einwandfrei, wenn Sicherheitsmodus = 'Keine' über http ist, aber natürlich gibt es keine Authentifizierung und nichts in System.ServiceModel.ServiceSecurityContext. Ich habe Dutzende von Variationen an all diesen Elementen ausprobiert, und es endet zwangsläufig mit der Anfrage, die eine Ausnahme auslöst "Eine bestehende Verbindung wurde vom entfernten Host zwangsweise geschlossen".
Ich verwende ein selbstsigniertes Zertifikat "CyberdyneIndustries", dessen CA-Zertifikat ich dem vertrauenswürdigen CA-Store hinzugefügt habe. Das Zertifikat überprüft, wenn ich es sehe. Ich habe die Hölle des HTTP-Namensraummanagements durchlaufen und diese Probleme ebenfalls gelöst. Es sieht einfach so aus, als würde WCF das nicht wirklich unterstützen ... bitte sag mir, dass ich falsch liege.
TIA.
Letztendlich entschied ich mich, die Sicherheit der Nachrichten zu versuchen, um zu sehen, ob das etwas Licht in die Situation bringen würde - es tat, und ich werde meine Verluste reduzieren und damit fortfahren. Also, es gibt keine definitive Antwort darauf.
Die Implementierung der Nachrichtensicherheit hat jedoch ein BIG-Problem ergeben, und dies könnte der Grund für das Transportsicherheitsproblem gewesen sein. Es gibt ein Stück Gift Dokumentation von MSDN:
Auf dieser Seite lautet der Befehl zum Erstellen des selbstsignierten Zertifikats wie folgt:
makecert -sk MyKeyName -iv RootCaClientTest.pvk -n "CN = tempClientcert" -ic RootCaClientTest.cer -sr aktueller Benutzer -ss meine -sky Signatur -pe
Das Argument "Signatur" sollte stattdessen "Austausch" sein. Nachdem ich alle meine Zertifikate wiederhergestellt hatte, funktionierte die Nachrichtensicherheit. Ein großer Vorteil von all dem ist, dass, wenn Sie die Transportsicherheit implementieren möchten, die Nachrichtensicherheit zuerst funktioniert, da die Fehlermeldungen, die Sie vom System bekommen, viel aussagekräftiger sind.
Erfolgt der SSL-Handshake? Aktivieren Sie die SChannel-Protokollierung, um die SSL-Schicht zu beheben. Sehen Sie sich diesen alten KB-Artikel an: So aktivieren Sie die Schkanal-Ereignisprotokollierung in IIS . Obwohl es sich um eine KB für W2K und XP handelt, sind die Schritte zur Aktivierung der SChannel-Protokollierung identisch und auf neueren Systemen weiterhin gültig. Wenn die Protokollierung aktiviert ist, können Sie feststellen, warum SSL das Zertifikat ablehnt.
Ich weiß, das ist 3 Jahre alt, aber für diejenigen, die vielleicht noch interessiert sind ...
Ich bin gerade dabei, WCF zu lernen (Sicherheit unter anderem) und war in der Lage, mit netTcpBinding (vermutlich funktioniert das auch für WsHttpBindings) den Transportsicherheitsmodus mit einem clientCredentialType="Certificate" richtig zu machen (und protectionLevel="EncryptAndSign", obwohl das für das Problem nicht relevant war).
Ich habe den Force Connection Close-Fehler auch von der Serverseite erfahren, aber ich habe festgestellt, dass mir ein Konfigurationsstück fehlt. Es funktioniert alles jetzt.
Hier ist meine serverseitige Konfiguration:
%Vor%Und meine clientseitige Konfiguration:
%Vor%Ich habe eine Zertifikatskette für den Server erstellt (selbstsigniertes vertrauenswürdiges Stammzertifikat + ein Zertifikat, das mit diesem Stamm erstellt wurde), indem ich die beschriebene Technik verwende hier und speicherte sowohl das Root-Zertifikat als auch das Kind-Zertifikat im Zertifikatsspeicher meines Server-Host-Rechners. Und schließlich habe ich dieses Serverzertifikat + öffentlichen Schlüssel in den Cert-Speicher auf meinem Client-Hostcomputer (in LocalMachine / TrustedPeople) importiert.
WsHttpBinding unterstützt die Zertifikatsauthentifizierung für die Transportsicherheit.
Es kann ein paar Dinge falsch sein:
Haben Sie Ihrem Laden beide Zertifikate hinzugefügt? CyberdyneIndustries sowie eine CA, mit der Sie es signiert haben? CA sollte in "Vertrauenswürdige Stammzertifizierungsstellen" sein
Auch das habe ich selbst gemacht, niemals in Visual Studio Dev Server. Versuchen Sie, Ihren Dienst mindestens in IIS zu hosten. Ich bin mir nicht sicher, ob VS Dev Server Zertifikate unterstützt.
Versuchen Sie, die Dienstauthentifizierung zu deaktivieren. Daher muss der Client den Dienst nicht authentifizieren. Ich weiß nicht, ob du das in deiner App willst oder nicht, sondern nur zum Testen, damit wir das ausschließen können
%Vor%
Tags und Links wcf configuration ssl x509certificate transport-security