[Update] - Ich hänge auch vollständige Konfigurationsdateien an, für Dienstleistung und für Kunde (außerhalb von hier, um das Thema nicht zu überschwemmen)
Die Situation, in der ich mich befinde, ist fast identisch mit der, die in este Frage, aber meine Frage ist etwas anders.
- Ich verwende NetTcpBinding mit Sicherheit eingestellt auf TransportWithMessageCredential
- Ich verwende Passwort/Benutzername Anmeldedaten, die von ASP.NET gesichert werden Anbieter
- Mein Dienst wird selbst in Windows gehostet Dienst
- I tun in meinem Endpunktverhalten haben spezifizierte Authentifizierung revocationMode="NoCheck"
Es ist erforderlich, dass der Dienst ein Zertifikat bereitstellt, um sich gegenüber Kunden zu authentifizieren. Das ist OK, ich tue es einfach:
<serviceCertificate findValue="***"
storeLocation="CurrentUser"
storeName="My"
x509FindType="FindByThumbprint"/>
Nun habe ich mir irgendwie vorgestellt, dass der Kunde am Ende
<identity>
<certificate encodedValue="encoded certificate"/>
</identity>
Und er wird in der Lage sein, die Anmeldedaten des Dienstes zu überprüfen ohne dass das Zertifikat im Speicher auf dem Client-Rechner installiert ist .
Ich war überrascht zu lernen dass, obwohl ich die Dienstanmeldeinformationen auf Zertifikat eingestellt habe, WSDL stellt aus.
<Identity>
<Dns>Foo</Dns>
</Identity>
Auch hier kann ich im Dienst die Identität auf CertificateReference setzen und sie mit demselben Zertifikat verknüpfen, und dann wird die WSDL die Identität als X509Certificate darstellen, aber wenn ich den Client ausführe, wird diese Einstellung ignoriert, und ich erhalte eine Fehlermeldung:
System.ServiceModel.Securi Das X.509-Zertifikat CN=xxx ist nicht im dem vertrauenswürdigen Personenspeicher. Das X.509 Zertifikat CN=xxx-Kettenbildung ist fehlgeschlagen. Das verwendete Zertifikat hat eine Vertrauenskette, die nicht verifiziert werden verifiziert werden kann. Ersetzen Sie das Zertifikat oder ändern Sie den certificateValidationMode. Eine Zertifikatskette wurde verarbeitet, aber endete in einem Root-Zertifikat, dem der Vertrauensanbieter nicht vertrauenswürdig ist.
Gibt es eine Möglichkeit, den Client dazu zu bringen, diesen Wert aus der Konfiguration zu verwenden und zu arbeiten, ohne ein Service-Zertifikat (oder dessen Root) auf dem Client-Rechner installieren zu müssen?
[UPDATE] Wenn Sie certificateValidationMode auf none setzen, verschwindet die Ausnahme zwar, aber aus Sicherheitsgründen ist dies eine inakzeptable Lösung.
Der Kunde muss lediglich bestätigen, dass er "irgendein" Zertifikat erhalten hat, ohne auf Einzelheiten einzugehen. Dadurch werden alle Arten von Man-in-the-Middle-Angriffen möglich. Die vom (angeblichen) Dienst gesendeten Informationen werden immer noch nicht mit dem in der Konfiguration hinterlegten Zertifikat abgeglichen.