Nachrichtensicherheit durch gegenseitige Zertifikate
Das folgende Szenario zeigt, wie ein Client und ein Dienst von Windows Communication Foundation (WCF) mit dem Nachrichtensicherheitsmodus gesichert werden. Sowohl der Client als auch der Dienst werden mit Zertifikaten authentifiziert.
Dieses Szenario ist interoperabel, da es WS-Sicherheit mit dem X.509-Zertifikatstokenprofil verwendet.
Tipp
Dieses Szenario führt keine Aushandlung für das Dienstzertifikat aus. Das Dienstzertifikat muss dem Client vor jeder Kommunikation bereitgestellt werden. Das Serverzertifikat kann mit der Anwendung oder im Rahmen einer Out-of-Band-Kommunikation bereitgestellt werden.
Merkmal | Beschreibung |
---|---|
Sicherheitsmodus |
Meldung |
Interoperabilität |
Ja, mit WS-Sicherheit und X.509-Zertifikatstokenprofil kompatible Clients und Dienste. |
Authentifizierung |
Gegenseitige Authentifizierung des Servers und des Clients. |
Integrität |
Ja |
Vertraulichkeit |
Ja |
Transport |
HTTP |
Bindung |
Dienst
Der folgende Code und die Konfiguration werden unabhängig voneinander ausgeführt. Führen Sie einen der folgenden Schritte aus:
- Erstellen Sie einen separaten Dienst, indem Sie den Code ohne Konfiguration verwenden.
- Erstellen Sie mit der angegebenen Konfiguration einen Dienst, aber definieren Sie keine Endpunkte.
Code
Im folgenden Code wird gezeigt, wie ein Dienstendpunkt, der Nachrichtensicherheit verwendet, erstellt wird. Der Dienst benötigt ein Zertifikat, um sich zu authentifizieren.
Konfiguration
Die folgende Konfiguration kann statt des Codes verwendet werden, um denselben Dienst einzurichten.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="serviceCredentialBehavior">
<serviceCredentials>
<serviceCertificate findValue="Contoso.com"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="serviceCredentialBehavior"
name="ServiceModel.Calculator">
<endpoint address="https://localhost/Calculator"
binding="wsHttpBinding"
bindingConfiguration="InteropCertificateBinding"
name="WSHttpBinding_ICalculator"
contract="ServiceModel.ICalculator" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="InteropCertificateBinding">
<security mode="Message">
<message clientCredentialType="Certificate"
negotiateServiceCredential="false"
establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client />
</system.serviceModel>
</configuration>
Client
Der folgende Code und die folgende Konfiguration werden unabhängig voneinander ausgeführt. Führen Sie einen der folgenden Schritte aus:
- Erstellen Sie mit dem Code (und dem Clientcode) einen eigenständigen Client.
- Erstellen Sie einen Client, der keine Endpunktadressen definiert. Verwenden Sie stattdessen den Clientkonstruktor, der den Konfigurationsnamen als Argument verwendet. Beispiel:
Code
Der folgende Code erstellt den Client. Der Sicherheitsmodus wird auf "Nachricht" und der Clientanmeldeinformationstyp wird auf "Zertifikat" eingestellt.
Konfiguration
Der Client wird wie folgt konfiguriert. Ein Clientzertifikat muss mit dem <clientCertificate> of <clientCredentials> Element angegeben werden. Auch das Dienstzertifikat mit dem <defaultCertificate> Element ist angegeben.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="ClientCredentialsBehavior">
<clientCredentials>
<clientCertificate findValue="Cohowinery.com"
storeLocation="CurrentUser"
storeName="My"
x509FindType="FindBySubjectName" />
<serviceCertificate>
<defaultCertificate findValue="Contoso.com"
storeLocation="CurrentUser"
storeName="TrustedPeople"
x509FindType="FindBySubjectName" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ICalculator" >
<security mode="Message">
<message clientCredentialType="Certificate"
negotiateServiceCredential="false"
establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://machineName/Calculator"
behaviorConfiguration="ClientCredentialsBehavior"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculator"
contract="ICalculator"
name="WSHttpBinding_ICalculator">
<identity>
<certificate encodedValue="Encoded_Value_Not_Shown" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>