Udostępnij za pośrednictwem


Instrukcje: Korzystanie z zabezpieczeń transportu i poświadczeń komunikatów

Zabezpieczanie usługi przy użyciu zarówno poświadczeń transportu, jak i komunikatów korzysta z najlepszych trybów zabezpieczeń transportu i komunikatów w programie Windows Communication Foundation (WCF). Podsumowując, zabezpieczenia warstwy transportu zapewniają integralność i poufność, podczas gdy zabezpieczenia warstwy komunikatów zapewniają różne poświadczenia, które nie są możliwe z rygorystycznymi mechanizmami zabezpieczeń transportu. W tym temacie przedstawiono podstawowe kroki implementowania transportu przy użyciu poświadczeń komunikatów WSHttpBinding przy użyciu powiązań i NetTcpBinding . Aby uzyskać więcej informacji na temat ustawiania trybu zabezpieczeń, zobacz Instrukcje: ustawianie trybu zabezpieczeń.

Podczas ustawiania trybu zabezpieczeń na TransportWithMessageCredentialwartość transport określa rzeczywisty mechanizm zapewniający zabezpieczenia na poziomie transportu. W przypadku protokołu HTTP mechanizm to Secure Sockets Layer (SSL) za pośrednictwem protokołu HTTP (HTTPS); dla protokołu TCP jest to protokół SSL za pośrednictwem protokołu TCP lub Windows.

Jeśli transport to HTTP (przy użyciu WSHttpBindingprotokołu ), protokół SSL za pośrednictwem protokołu HTTP zapewnia zabezpieczenia na poziomie transportu. W takim przypadku należy skonfigurować komputer hostujący usługę przy użyciu certyfikatu SSL powiązanego z portem, jak pokazano w dalszej części tego tematu.

Jeśli transport to TCP (przy użyciu NetTcpBindingprotokołu ), domyślnie zapewniane zabezpieczenia na poziomie transportu to zabezpieczenia systemu Windows lub protokół SSL za pośrednictwem protokołu TCP. W przypadku korzystania z protokołu SSL za pośrednictwem protokołu TCP należy określić certyfikat przy użyciu metody , jak pokazano w dalszej części tego tematu SetCertificate .

Aby użyć usługi WSHttpBinding z certyfikatem na potrzeby zabezpieczeń transportu (w kodzie)

  1. Użyj narzędzia HttpCfg.exe, aby powiązać certyfikat SSL z portem na maszynie. Aby uzyskać więcej informacji, zobacz How to: Configure a Port with an SSL Certificate (Instrukcje: konfigurowanie portu przy użyciu certyfikatu SSL).

  2. Utwórz wystąpienie WSHttpBinding klasy i ustaw Mode właściwość na TransportWithMessageCredential.

  3. ClientCredentialType Ustaw właściwość na odpowiednią wartość. (Aby uzyskać więcej informacji, zobacz Wybieranie typu poświadczeń). Poniższy kod używa Certificate wartości .

  4. Utwórz wystąpienie Uri klasy z odpowiednim adresem podstawowym. Należy pamiętać, że adres musi używać schematu "HTTPS" i musi zawierać rzeczywistą nazwę maszyny oraz numer portu, z którą jest powiązany certyfikat SSL. (Alternatywnie można ustawić adres podstawowy w konfiguracji).

  5. Dodaj punkt końcowy usługi przy użyciu AddServiceEndpoint metody .

  6. Utwórz wystąpienie ServiceHost metody i wywołaj metodę Open , jak pokazano w poniższym kodzie.

    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()
    

Aby użyć narzędzia NetTcpBinding z certyfikatem na potrzeby zabezpieczeń transportu (w kodzie)

  1. Utwórz wystąpienie NetTcpBinding klasy i ustaw Mode właściwość na TransportWithMessageCredential.

  2. ClientCredentialType Ustaw wartość na odpowiednią wartość. Poniższy kod używa Certificate wartości .

  3. Utwórz wystąpienie Uri klasy z odpowiednim adresem podstawowym. Należy pamiętać, że adres musi używać schematu "net.tcp". (Alternatywnie można ustawić adres podstawowy w konfiguracji).

  4. Utwórz wystąpienie ServiceHost klasy.

  5. SetCertificate Użyj metody X509CertificateRecipientServiceCredential klasy, aby jawnie ustawić certyfikat X.509 dla usługi.

  6. Dodaj punkt końcowy usługi przy użyciu AddServiceEndpoint metody .

  7. Wywołaj metodę Open , jak pokazano w poniższym kodzie.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://baseAddress");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    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 netTcpAddress As New Uri("net.tcp://baseAddress")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    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()
    

Aby użyć narzędzia NetTcpBinding z systemem Windows na potrzeby zabezpieczeń transportu (w kodzie)

  1. Utwórz wystąpienie NetTcpBinding klasy i ustaw Mode właściwość na TransportWithMessageCredential.

  2. Ustaw zabezpieczenia transportu, aby używać systemu Windows, ustawiając wartość ClientCredentialTypeWindowsna . (Należy pamiętać, że jest to wartość domyślna).

  3. ClientCredentialType Ustaw wartość na odpowiednią wartość. Poniższy kod używa Certificate wartości .

  4. Utwórz wystąpienie Uri klasy z odpowiednim adresem podstawowym. Należy pamiętać, że adres musi używać schematu "net.tcp". (Alternatywnie można ustawić adres podstawowy w konfiguracji).

  5. Utwórz wystąpienie ServiceHost klasy.

  6. SetCertificate Użyj metody X509CertificateRecipientServiceCredential klasy, aby jawnie ustawić certyfikat X.509 dla usługi.

  7. Dodaj punkt końcowy usługi przy użyciu AddServiceEndpoint metody .

  8. Wywołaj metodę Open , jak pokazano w poniższym kodzie.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://Tcp");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    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 netTcpAddress As New Uri("net.tcp://Tcp")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    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()
    

Korzystanie z konfiguracji

Aby użyć usługi WSHttpBinding

  1. Skonfiguruj komputer przy użyciu certyfikatu SSL powiązanego z portem. (Aby uzyskać więcej informacji, zobacz Instrukcje: konfigurowanie portu przy użyciu certyfikatu SSL). Nie trzeba ustawiać <transport> wartości elementu przy użyciu tej konfiguracji.

  2. Określ typ poświadczeń klienta dla zabezpieczeń na poziomie komunikatu. Poniższy przykład ustawia clientCredentialType atrybut elementu><messagena UserNamewartość .

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

Aby użyć narzędzia NetTcpBinding z certyfikatem na potrzeby zabezpieczeń transportu

  1. W przypadku protokołu SSL za pośrednictwem protokołu TCP należy jawnie określić certyfikat w elemecie <behaviors> . Poniższy przykład określa certyfikat przez jego wystawcę w domyślnej lokalizacji magazynu (komputera lokalnego i magazynów osobistych).

    <behaviors>  
     <serviceBehaviors>  
       <behavior name="mySvcBehavior">  
           <serviceCredentials>  
             <serviceCertificate findValue="contoso.com"  
                                 x509FindType="FindByIssuerName" />  
           </serviceCredentials>  
       </behavior>  
     </serviceBehaviors>  
    </behaviors>  
    
  2. Dodawanie polecenia <netTcpBinding> do sekcji powiązań

  3. Dodaj element powiązania i ustaw name atrybut na odpowiednią wartość.

  4. <>securityDodaj element i ustaw mode atrybut na TransportWithMessageCredential.

  5. <message> Dodaj element i ustaw clientCredentialType atrybut na odpowiednią wartość.

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

Aby użyć narzędzia NetTcpBinding z systemem Windows na potrzeby zabezpieczeń transportu

  1. <Dodawanie polecenia netTcpBinding> do sekcji powiązań,

  2. <>bindingDodaj element i ustaw name atrybut na odpowiednią wartość.

  3. <>securityDodaj element i ustaw mode atrybut na TransportWithMessageCredential.

  4. <>transportDodaj element i ustaw clientCredentialType atrybut na Windows.

  5. <>messageDodaj element i ustaw clientCredentialType atrybut na odpowiednią wartość. Poniższy kod ustawia wartość na certyfikat.

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

Zobacz też