Como usar a segurança de transporte e credenciais de mensagem

Proteger um serviço com credenciais de transporte e mensagem usa o melhor dos modos de segurança de Transporte e Mensagem no Windows Communication Foundation (WCF). Em suma, a segurança da camada de transporte fornece integridade e confidencialidade, enquanto a segurança da camada de mensagem fornece uma variedade de credenciais que não são possíveis com mecanismos de segurança de transporte rigorosos. Este tópico mostra as etapas básicas para implementar o transporte com credenciais de mensagem usando as WSHttpBinding ligações e NetTcpBinding . Para obter mais informações sobre como definir o modo de segurança, consulte Como definir o modo de segurança.

Ao definir o modo de segurança como TransportWithMessageCredential, o transporte determina o mecanismo real que fornece a segurança no nível de transporte. Para HTTP, o mecanismo é Secure Sockets Layer (SSL) sobre HTTP (HTTPS); para TCP, é SSL sobre TCP ou Windows.

Se o transporte for HTTP (usando o WSHttpBinding), SSL sobre HTTP fornece a segurança no nível de transporte. Nesse caso, você deve configurar o computador que hospeda o serviço com um certificado SSL vinculado a uma porta, conforme mostrado posteriormente neste tópico.

Se o transporte for TCP (usando o NetTcpBinding), por padrão, a segurança no nível de transporte fornecida é a segurança do Windows ou SSL sobre TCP. Ao usar SSL sobre TCP, você deve especificar o certificado usando o SetCertificate método, conforme mostrado posteriormente neste tópico.

Para usar o WSHttpBinding com um certificado para segurança de transporte (em código)

  1. Use a ferramenta HttpCfg.exe para vincular um certificado SSL a uma porta na máquina. Para obter mais informações, consulte Como configurar uma porta com um certificado SSL.

  2. Crie uma instância da WSHttpBinding classe e defina a Mode propriedade como TransportWithMessageCredential.

  3. Defina a ClientCredentialType propriedade como um valor apropriado. (Para obter mais informações, consulte Selecionando um tipo de credencial.) O código a seguir usa o Certificate valor.

  4. Crie uma instância da Uri classe com um endereço base apropriado. Observe que o endereço deve usar o esquema "HTTPS" e deve conter o nome real da máquina e o número da porta à qual o certificado SSL está vinculado. (Como alternativa, você pode definir o endereço base na configuração.)

  5. Adicione um ponto de extremidade de serviço usando o AddServiceEndpoint método.

  6. Crie a instância do e chame ServiceHost o Open método, conforme mostrado no código a seguir.

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

Para usar o NetTcpBinding com um certificado para segurança de transporte (em código)

  1. Crie uma instância da NetTcpBinding classe e defina a Mode propriedade como TransportWithMessageCredential.

  2. Defina o ClientCredentialType como um valor apropriado. O código a seguir usa o Certificate valor.

  3. Crie uma instância da Uri classe com um endereço base apropriado. Observe que o endereço deve usar o esquema "net.tcp". (Como alternativa, você pode definir o endereço base na configuração.)

  4. Crie a instância da ServiceHost classe.

  5. Use o SetCertificate método da X509CertificateRecipientServiceCredential classe para definir explicitamente o certificado X.509 para o serviço.

  6. Adicione um ponto de extremidade de serviço usando o AddServiceEndpoint método.

  7. Chame o Open método, conforme mostrado no código a seguir.

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

Para usar o NetTcpBinding com o Windows para segurança de transporte (em código)

  1. Crie uma instância da NetTcpBinding classe e defina a Mode propriedade como TransportWithMessageCredential.

  2. Defina a segurança de transporte para usar o Windows definindo como ClientCredentialType Windows. (Observe que esse é o padrão.)

  3. Defina o ClientCredentialType como um valor apropriado. O código a seguir usa o Certificate valor.

  4. Crie uma instância da Uri classe com um endereço base apropriado. Observe que o endereço deve usar o esquema "net.tcp". (Como alternativa, você pode definir o endereço base na configuração.)

  5. Crie a instância da ServiceHost classe.

  6. Use o SetCertificate método da X509CertificateRecipientServiceCredential classe para definir explicitamente o certificado X.509 para o serviço.

  7. Adicione um ponto de extremidade de serviço usando o AddServiceEndpoint método.

  8. Chame o Open método, conforme mostrado no código a seguir.

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

Usando a configuração

Para usar o WSHttpBinding

  1. Configure o computador com um certificado SSL vinculado a uma porta. (Para obter mais informações, consulte Como: Configurar uma porta com um certificado SSL). Não é necessário definir um valor de <transport> elemento com essa configuração.

  2. Especifique o tipo de credencial do cliente para a segurança no nível da mensagem. O exemplo a seguir define o clientCredentialType <message> atributo do elemento como UserName.

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

Para usar o NetTcpBinding com um certificado para segurança de transporte

  1. Para SSL sobre TCP, você deve especificar explicitamente o <behaviors> certificado no elemento . O exemplo a seguir especifica um certificado por seu emissor no local de armazenamento padrão (máquina local e armazenamentos pessoais).

    <behaviors>
     <serviceBehaviors>
       <behavior name="mySvcBehavior">
           <serviceCredentials>
             <serviceCertificate findValue="contoso.com"
                                 x509FindType="FindByIssuerName" />
           </serviceCredentials>
       </behavior>
     </serviceBehaviors>
    </behaviors>
    
  2. Adicionar um <netTcpBinding> à seção de ligações

  3. Adicione um elemento binding e defina o name atributo como um valor apropriado.

  4. Adicione um <security> elemento e defina o mode atributo como TransportWithMessageCredential.

  5. Adicione um <message> elemento e defina o clientCredentialType atributo como um valor apropriado.

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

Para usar o NetTcpBinding com o Windows para segurança de transporte

  1. Adicione um <netTcpBinding> à seção bindings,

  2. Adicione um <binding> elemento e defina o name atributo para um valor apropriado.

  3. Adicione um <security> elemento e defina o mode atributo como TransportWithMessageCredential.

  4. Adicione um <transport> elemento e defina o clientCredentialType atributo como Windows.

  5. Adicione um <message> elemento e defina o clientCredentialType atributo para um valor apropriado. O código a seguir define o valor como um certificado.

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

Consulte também