Vorgehensweise: Verwenden von Transportsicherheit und NachrichtenanmeldeinformationenHow to: Use Transport Security and Message Credentials

Das Absichern eines Diensts mit Transport- und Nachrichtenanmeldeinformationen vereint die Vorteile der Transport- und Nachrichtensicherheitsmodi in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF).Securing a service with both transport and message credentials uses the best of both Transport and Message security modes in Windows Communication Foundation (WCF)Windows Communication Foundation (WCF). Während die Transport Layer Security (TLS) Integrität und Vertraulichkeit bietet, stellt die Message Layer Security (MLS) verschiedene Anmeldeinformationen bereit, die bei reinen Transportsicherheitsmechanismen nicht verfügbar sind.In sum, transport-layer security provides integrity and confidentiality, while message-layer security provides a variety of credentials that are not possible with strict transport security mechanisms. In diesem Thema werden die grundlegenden Schritte zur Implementierung des Transports mit Nachrichtenanmeldeinformationen mithilfe der Bindungen WSHttpBinding und NetTcpBinding veranschaulicht.This topic shows the basic steps for implementing transport with message credentials using the WSHttpBinding and NetTcpBinding bindings. Weitere Informationen finden Sie unterFor more information aboutFestlegen des Sicherheitsmodus, finden Sie unter Vorgehensweise: Festlegen des Sicherheitsmodus. setting the security mode, see How to: Set the Security Mode.

Wenn Sie den Sicherheitsmodus auf TransportWithMessageCredential festlegen, wird der tatsächliche Mechanismus, der die Sicherheitseinstellungen auf Transportebene bereitstellt, vom Transport bestimmt.When setting the security mode to TransportWithMessageCredential, the transport determines the actual mechanism that provides the transport-level security. Der Secure Sockets Layer (SSL)-Mechanismus über HTTP (HTTPS) wird für HTTP verwendet, wohingegen SSL über TCP oder Windows für TCP verwendet wird.For HTTP, the mechanism is Secure Sockets Layer (SSL) over HTTP (HTTPS); for TCP, it is SSL over TCP or Windows.

Wenn der Transport HTTP ist (unter Verwendung der WSHttpBinding), dann wird die Sicherheit auf Transportebene von SSL über HTTP bereitgestellt.If the transport is HTTP (using the WSHttpBinding), SSL over HTTP provides the transport-level security. In diesem Fall müssen Sie den Computer, der als Host für den Dienst fungiert, mit einem SSL-Zertifikat konfigurieren, das an einen Anschluss gebunden ist. Dies wird im weiteren Verlauf des Themas noch näher erläutert.In that case, you must configure the computer hosting the service with an SSL certificate bound to a port, as shown later in this topic.

Wenn der Transport TCP ist (unter Verwendung der NetTcpBinding), wird für die Sicherheit auf Transportebene standardmäßig die Windows-Sicherheit bereitgestellt oder SSL über TCP wird verwendet.If the transport is TCP (using the NetTcpBinding), by default the transport-level security provided is Windows security, or SSL over TCP. Wenn Sie SSL über TCP verwenden, müssen Sie das Zertifikat mit der SetCertificate-Methode angeben. Dies wird im weiteren Verlauf des Themas noch näher erläutert.When using SSL over TCP, you must specify the certificate using the SetCertificate method, as shown later in this topic.

So verwenden Sie die WSHttpBinding mit einem Zertifikat für die Transportsicherheit (im Code)To use the WSHttpBinding with a certificate for transport security (in code)

  1. Binden Sie ein SSL-Zertifikat mit dem Tool HttpCfg.exe an einen Anschluss auf dem Computer.Use the HttpCfg.exe tool to bind an SSL certificate to a port on the machine. Weitere Informationen finden Sie unterFor more information, seeVorgehensweise: Konfigurieren eines Anschlusses mit einem SSL-Zertifikat. How to: Configure a Port with an SSL Certificate.

  2. Erstellen Sie eine Instanz der WSHttpBinding-Klasse, und legen Sie die Mode-Eigenschaft auf TransportWithMessageCredential fest.Create an instance of the WSHttpBinding class and set the Mode property to TransportWithMessageCredential.

  3. Legen Sie für die ClientCredentialType-Eigenschaft einen geeigneten Wert fest.Set the ClientCredentialType property to an appropriate value. (Weitere Informationen finden Sie unterFor more information, see Auswählen eines Anmeldeinformationentyps.) Im folgenden Code wird der Certificate-Wert verwendet.(Weitere Informationen finden Sie unterFor more information, see Selecting a Credential Type.) The following code uses the Certificate value.

  4. Erstellen Sie eine Instanz der Uri-Klasse mit einer entsprechenden Basisadresse.Create an instance of the Uri class with an appropriate base address. Dabei muss das HTTPS-Schema verwendet werden, und die Adresse muss den tatsächlichen Namen des Computers sowie die Nummer des Anschlusses enthalten, an den das SSL-Zertifikat gebunden ist.Note that the address must use the "HTTPS" scheme and must contain the actual name of the machine and the port number that the SSL certificate is bound to. (Sie können die Basisadresse auch in der Konfiguration festlegen.)(Alternatively, you can set the base address in configuration.)

  5. Fügen Sie mit der AddServiceEndpoint-Methode einen Dienstendpunkt hinzu.Add a service endpoint using the AddServiceEndpoint method.

  6. Erstellen Sie eine Instanz des ServiceHost, und rufen Sie die Open-Methode auf, wie im folgenden Code veranschaulicht.Create the instance of the ServiceHost and call the Open method, as shown in the following code.

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.TransportWithMessageCredential;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    
    // The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Uri httpsAddress = new Uri("https://localMachineName:8006/base");
    ServiceHost sh = new ServiceHost(typeof(Calculator), httpsAddress);
    sh.AddServiceEndpoint(typeof(ICalculator), b, "HttpsCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.TransportWithMessageCredential
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    
    ' The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Dim httpsAddress As New Uri("https://localMachineName:8006/base")
    Dim sh As New ServiceHost(GetType(Calculator), httpsAddress)
    sh.AddServiceEndpoint(GetType(ICalculator), b, "HttpsCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

So verwenden Sie die NetTcpBinding mit einem Zertifikat für die Transportsicherheit (im Code)To use the NetTcpBinding with a certificate for transport security (in code)

  1. Erstellen Sie eine Instanz der NetTcpBinding-Klasse, und legen Sie die Mode-Eigenschaft auf TransportWithMessageCredential fest.Create an instance of the NetTcpBinding class and set the Mode property to TransportWithMessageCredential.

  2. Legen Sie den ClientCredentialType auf einen geeigneten Wert fest.Set the ClientCredentialType to an appropriate value. Im folgenden Code wird der Certificate-Wert verwendet.The following code uses the Certificate value.

  3. Erstellen Sie eine Instanz der Uri-Klasse mit einer entsprechenden Basisadresse.Create an instance of the Uri class with an appropriate base address. Die Adresse muss das NET.TCP-Schema verwenden.Note that the address must use the "net.tcp" scheme. (Sie können die Basisadresse auch in der Konfiguration festlegen.)(Alternatively, you can set the base address in configuration.)

  4. Erstellen Sie die Instanz der ServiceHost-Klasse.Create the instance of the ServiceHost class.

  5. Legen Sie das X.509-Zertifikat für den Dienst mit der SetCertificate-Methode der X509CertificateRecipientServiceCredential-Klasse explizit fest.Use the SetCertificate method of the X509CertificateRecipientServiceCredential class to explicitly set the X.509 certificate for the service.

  6. Fügen Sie mit der AddServiceEndpoint-Methode einen Dienstendpunkt hinzu.Add a service endpoint using the AddServiceEndpoint method.

  7. Rufen Sie die Open-Methode auf, wie im folgenden Code dargestellt:Call the Open method, as shown in the following code.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAdddress = new Uri("net.tcp://baseAddress");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAdddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAdddress As New Uri("net.tcp://baseAddress")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAdddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

So verwenden Sie die NetTcpBinding mit Windows für die Transportsicherheit (im Code)To use the NetTcpBinding with Windows for transport security (in code)

  1. Erstellen Sie eine Instanz der NetTcpBinding-Klasse, und legen Sie die Mode-Eigenschaft auf TransportWithMessageCredential fest.Create an instance of the NetTcpBinding class and set the Mode property to TransportWithMessageCredential.

  2. Legen Sie die Transportsicherheit auf Windows fest, indem Sie den ClientCredentialType auf Windows festlegen.Set the transport security to use Windows by setting the ClientCredentialType to Windows. (Dabei handelt es sich um die Standardeinstellung.)(Note that this is the default.)

  3. Legen Sie den ClientCredentialType auf einen geeigneten Wert fest.Set the ClientCredentialType to an appropriate value. Im folgenden Code wird der Certificate-Wert verwendet.The following code uses the Certificate value.

  4. Erstellen Sie eine Instanz der Uri-Klasse mit einer entsprechenden Basisadresse.Create an instance of the Uri class with an appropriate base address. Die Adresse muss das NET.TCP-Schema verwenden.Note that the address must use the "net.tcp" scheme. (Sie können die Basisadresse auch in der Konfiguration festlegen.)(Alternatively, you can set the base address in configuration.)

  5. Erstellen Sie die Instanz der ServiceHost-Klasse.Create the instance of the ServiceHost class.

  6. Legen Sie das X.509-Zertifikat für den Dienst mit der SetCertificate-Methode der X509CertificateRecipientServiceCredential-Klasse explizit fest.Use the SetCertificate method of the X509CertificateRecipientServiceCredential class to explicitly set the X.509 certificate for the service.

  7. Fügen Sie mit der AddServiceEndpoint-Methode einen Dienstendpunkt hinzu.Add a service endpoint using the AddServiceEndpoint method.

  8. Rufen Sie die Open-Methode auf, wie im folgenden Code dargestellt:Call the Open method, as shown in the following code.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAdddress = new Uri("net.tcp://Tcp");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAdddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com"); 
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAdddress As New Uri("net.tcp://Tcp")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAdddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Verwenden der KonfigurationUsing Configuration

So verwenden Sie die WSHttpBindingTo use the WSHttpBinding

  1. Konfigurieren Sie den Computer mit einem SSL-Zertifikat, das an einen Anschluss gebunden ist.Configure the computer with an SSL certificate bound to a port. (Weitere Informationen finden Sie unterFor more information, see Vorgehensweise: Konfigurieren eines Anschlusses mit einem SSL-Zertifikat).(Weitere Informationen finden Sie unterFor more information, see How to: Configure a Port with an SSL Certificate). Sie müssen nicht festlegen einer <transport> Elementwert mit dieser Konfiguration.You do not need to set a <transport> element value with this configuration.

  2. Geben Sie den Typ der Anmeldeinformationen für den Client bezüglich der Sicherheit auf Nachrichtenebene an.Specify the client credential type for the message-level security. Im folgenden Beispiel wird die clientCredentialType Attribut von der <message>-Element UserName.The following example sets the clientCredentialType attribute of the <message> element to UserName.

    <wsHttpBinding>  
    <binding name="WsHttpBinding_ICalculator">  
            <security mode="TransportWithMessageCredential" >  
               <message clientCredentialType="UserName" />  
            </security>  
    </binding>  
    </wsHttpBinding>  
    

So verwenden Sie die NetTcpBinding mit einem Zertifikat für die TransportsicherheitTo use the NetTcpBinding with a certificate for transport security

  1. Bei SSL über TCP müssen Sie das Zertifikat explizit im <behaviors>-Element angeben.For SSL over TCP, you must explicitly specify the certificate in the <behaviors> element. Im folgenden Beispiel wird ein Zertifikat vom Aussteller am Standardspeicherort angegeben (lokaler Computer und persönlicher Speicher).The following example specifies a certificate by its issuer in the default store location (local machine and personal stores).

    <behaviors>  
     <serviceBehaviors>  
       <behavior name="mySvcBehavior">  
           <serviceCredentials>  
             <serviceCertificate findValue="contoso.com"  
                                 x509FindType="FindByIssuerName" />  
           </serviceCredentials>  
       </behavior>  
     </serviceBehaviors>  
    </behaviors>  
    
  2. Hinzufügen einer <NetTcpBinding > , die im Abschnitt über BindungenAdd a <netTcpBinding> to the bindings section

  3. Fügen Sie ein Bindungselement hinzu, und legen Sie das name-Attribut auf einen geeigneten Wert fest.Add a binding element, and set the name attribute to an appropriate value.

  4. Hinzufügen einer <security>-Element, und legen die mode -Attribut TransportWithMessageCredential.Add a <security> element, and set the mode attribute to TransportWithMessageCredential.

  5. Hinzufügen einer <message> -Element, und legen die clientCredentialType -Attribut auf einen geeigneten Wert.Add a <message> element, and set the clientCredentialType attribute to an appropriate value.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <message clientCredentialType="Windows" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

So verwenden Sie die NetTcpBinding mit Windows für die TransportsicherheitTo use the NetTcpBinding with Windows for transport security

  1. Hinzufügen einer <NetTcpBinding > Abschnitt BindungenAdd a <netTcpBinding> to the bindings section,

  2. Hinzufügen einer <binding> Element, und legen die name -Attribut auf einen geeigneten Wert.Add a <binding> element and set the name attribute to an appropriate value.

  3. Hinzufügen einer <security>-Element, und legen die mode -Attribut TransportWithMessageCredential.Add a <security> element, and set the mode attribute to TransportWithMessageCredential.

  4. Hinzufügen einer <transport> Element, und legen die clientCredentialType -Attribut Windows.Add a <transport> element and set the clientCredentialType attribute to Windows.

  5. Hinzufügen einer <message> Element, und legen die clientCredentialType -Attribut auf einen geeigneten Wert.Add a <message> element and set the clientCredentialType attribute to an appropriate value. Im folgenden Code wird der Wert auf ein Zertifikat festgelegt.The following code sets the value to a certificate.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <transport clientCredentialType="Windows" />  
           <message clientCredentialType="Certificate" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

Siehe auchSee Also

Vorgehensweise: Festlegen des SicherheitsmodusHow to: Set the Security Mode
Sichern von DienstenSecuring Services
Sichern von Diensten und ClientsSecuring Services and Clients