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
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
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
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.
Para acessar a impressão digital do certificado. Para saber mais, confira Como recuperar a impressão digital de um certificado.
Copie a impressão digital do certificado em um editor de texto, como o Bloco de Notas.
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
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.
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={00001111-aaaa-2222-bbbb-3333cccc4444}
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
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.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={00001111-aaaa-2222-bbbb-3333cccc4444} clientcertnegotiation=enable
Excluir um certificado SSL de um número de porta
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
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
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