Como: configurar uma porta com um certificado SSL

Ao criar um serviço auto-hospedado do WCF (Windows Communication Foundation) com a classe WSHttpBinding que usa segurança de transporte, você também deve configurar uma porta com um certificado X.509. Se você estiver criando um serviço auto-hospedado, você poderá hospedá-lo serviço no IIS (Serviços de Informações da Internet). Para obter mais informações, confira Segurança de transporte de HTTP.

Para configurar uma porta, a ferramenta usada depende do sistema operacional que está sendo executado no computador.

Se estiver executando o Windows Server 2003, use a ferramenta HttpCfg.exe. No Windows Server 2003, essa ferramenta está instalada. Para obter mais informações, confira Visão geral do Httpcfg. A Documentação de Ferramentas de Suporte do Windows explica a sintaxe da ferramenta Httpcfg.exe.

Se estiver executando o Windows Vista, use a ferramenta Netsh.exe que já está instalada.

Observação

A modificação de certificados armazenados no computador requer privilégios administrativos.

Determinar como as portas são configuradas

  1. No Windows Server 2003 ou no Windows XP, use a ferramenta de HttpCfg.exe para exibir a configuração atual da porta, usando as opções query e ssl, conforme mostrado no exemplo a seguir.

    httpcfg query ssl  
    
  2. No Windows Vista, use a ferramenta Netsh.exe para exibir a configuração atual da porta, conforme mostrado no exemplo a seguir.

    netsh http show sslcert  
    

Obter a impressão digital de um certificado

  1. Use o snap-in do MMC dos Certificados para localizar um certificado X.509 cuja finalidade seja a autenticação de cliente. Para saber mais, consulte Como Exibir Certificados com o Snap-in do MMC.

  2. Para acessar a impressão digital do certificado. Para saber mais, confira Como recuperar a impressão digital de um certificado.

  3. Copie a impressão digital do certificado em um editor de texto, como o Bloco de Notas.

  4. Remova todos os espaços entre os caracteres hexadecimais. Uma maneira de fazer isso é usar o recurso localizar e substituir do editor de texto e substituir cada espaço com um caractere nulo.

Associar um certificado SSL a um número de porta

  1. No Windows Server 2003 ou no Windows XP, use a ferramenta HttpCfg.exe no modo “set” no repositório SSL para associar o certificado a um número de porta. A ferramenta usa a impressão digital para identificar o certificado, conforme mostrado no exemplo o seguir.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
    • A opção -i tem a sintaxe IP:port e instrui a ferramenta a definir o certificado para a porta 8012 do computador. Opcionalmente, os quatro zeros que precedem o número também podem ser substituídos pelo endereço IP real do computador.

    • A opção -h especifica a impressão digital do certificado.

  2. No Windows Vista, use a ferramenta Netsh.exe, conforme mostrado no exemplo a seguir.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
    
    • O parâmetro certhash especifica a impressão digital do certificado.

    • O parâmetro ipport especifica o endereço IP e a porta e funciona exatamente como a opção -i da ferramenta Httpcfg.exe descrita.

    • O parâmetro appid é um GUID que pode ser usado para identificar o aplicativo proprietário.

Associar um certificado SSL a um número de porta e dar suporte a certificados do cliente

  1. No Windows Server 2003 ou no Windows XP, para dar suporte aos clientes que se autenticam com os certificados X.509 na camada de transporte, siga o procedimento anterior, mas inclua um parâmetro adicional de linha de comando ao HttpCfg.exe, conforme mostrado no exemplo a seguir.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6 -f 2  
    

    A opção -f tem a sintaxe de n onde n é um número entre 1 e 7. Um valor de 2, conforme mostrado no exemplo anterior, permite certificados do cliente na camada de transporte. Um valor de 3 permite certificados do cliente e mapeia esses certificados para uma conta do Windows. Consulte a Ajuda do HttpCfg.exe para obter o comportamento de outros valores.

  2. No Windows Vista, para dar suporte aos clientes que se autenticam com os certificados X.509 na camada de transporte, siga o procedimento anterior, mas com um parâmetro adicional, conforme mostrado no exemplo a seguir.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} clientcertnegotiation=enable  
    

Excluir um certificado SSL de um número de porta

  1. Use a ferramenta HttpCfg.exe ou Netsh.exe para ver as portas e as impressões digitais de todas as associações no computador. Para imprimir informações no disco, use o caractere de redirecionamento ">", conforme mostrado no exemplo a seguir.

    httpcfg query ssl>myMachinePorts.txt  
    
  2. No Windows Server 2003 ou no Windows XP, use a ferramenta HttpCfg.exe com as palavras-chave delete e ssl. Use a opção -i para especificar o número IP:port, e a opção -h para especificar a impressão digital.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
  3. No Windows Vista, use a ferramenta Netsh.exe, conforme mostrado no exemplo a seguir.

    Netsh http delete sslcert ipport=0.0.0.0:8005  
    

Exemplo

O código a seguir mostra como criar um serviço auto-hospedado usando o conjunto de classes WSHttpBinding para segurança no transporte. Ao criar um aplicativo, especifique o número da porta no endereço.

// This string uses a function to prepend the computer name at run time.
string addressHttp = String.Format(
    "http://{0}:8080/Calculator",
    System.Net.Dns.GetHostEntry("").HostName);

WSHttpBinding b = new WSHttpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

// You must create an array of URI objects to have a base address.
Uri a = new Uri(addressHttp);
Uri[] baseAddresses = new Uri[] { a };

// Create the ServiceHost. The service type (Calculator) is not
// shown here.
ServiceHost sh = new ServiceHost(typeof(Calculator), baseAddresses);

// Add an endpoint to the service. Insert the thumbprint of an X.509
// certificate found on your computer.
Type c = typeof(ICalculator);
sh.AddServiceEndpoint(c, b, "MyCalculator");
sh.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindBySubjectName,
    "contoso.com");

// This next line is optional. It specifies that the client's certificate
// does not have to be issued by a trusted authority, but can be issued
// by a peer if it is in the Trusted People store. Do not use this setting
// for production code. The default is PeerTrust, which specifies that
// the certificate must originate from a trusted certificate authority.

// sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
// X509CertificateValidationMode.PeerOrChainTrust;
try
{
    sh.Open();

    string address = sh.Description.Endpoints[0].ListenUri.AbsoluteUri;
    Console.WriteLine("Listening @ {0}", address);
    Console.WriteLine("Press enter to close the service");
    Console.ReadLine();
    sh.Close();
}
catch (CommunicationException ce)
{
    Console.WriteLine("A communication error occurred: {0}", ce.Message);
    Console.WriteLine();
}
catch (System.Exception exc)
{
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message);
    Console.ReadLine();
}
' This string uses a function to prepend the computer name at run time.
Dim addressHttp As String = String.Format("http://{0}:8080/Calculator", _
System.Net.Dns.GetHostEntry("").HostName)

Dim b As New WSHttpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate

' You must create an array of URI objects to have a base address.
Dim a As New Uri(addressHttp)
Dim baseAddresses() As Uri = {a}

' Create the ServiceHost. The service type (Calculator) is not
' shown here.
Dim sh As New ServiceHost(GetType(Calculator), baseAddresses)

' Add an endpoint to the service. Insert the thumbprint of an X.509 
' certificate found on your computer. 
Dim c As Type = GetType(ICalculator)
sh.AddServiceEndpoint(c, b, "MyCalculator")
sh.Credentials.ServiceCertificate.SetCertificate( _
                StoreLocation.LocalMachine, _
                StoreName.My, _
                X509FindType.FindBySubjectName, _
                "contoso.com")

' This next line is optional. It specifies that the client's certificate
' does not have to be issued by a trusted authority, but can be issued
' by a peer if it is in the Trusted People store. Do not use this setting
' for production code. The default is PeerTrust, which specifies that 
' the certificate must originate from a trusted certificate authority.
' sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
' X509CertificateValidationMode.PeerOrChainTrust
Try
    sh.Open()

    Dim address As String = sh.Description.Endpoints(0).ListenUri.AbsoluteUri
    Console.WriteLine("Listening @ {0}", address)
    Console.WriteLine("Press enter to close the service")
    Console.ReadLine()
    sh.Close()
Catch ce As CommunicationException
    Console.WriteLine("A communication error occurred: {0}", ce.Message)
    Console.WriteLine()
Catch exc As System.Exception
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message)
    Console.ReadLine()
End Try

Confira também