Como: Proteger um serviço com um certificado X.509
Proteger um serviço com um certificado X.509 é uma técnica básica que a maioria das associações no Windows Communication Foundation (WCF) usa. Este tópico descreve as etapas de configuração de um serviço auto-hospedado com um certificado X.509.
Um pré-requisito é um certificado válido que pode ser usado para autenticar o servidor. O certificado deve ser emitido para o servidor por uma autoridade de certificação confiável. Se o certificado não for válido, qualquer cliente que tente usar o serviço não confiará no serviço e, consequentemente, nenhuma conexão será feita. Para obter mais informações sobre como usar certificados, consulte Trabalhando com certificados.
Para configurar um serviço com um certificado usando código
Crie o contrato de serviço e o serviço implementado. Para obter mais informações, consulte Projetando e implementando serviços.
Crie uma instância da WSHttpBinding classe e defina seu modo de segurança como Message, conforme mostrado no código a seguir.
// Create a binding and set the security mode to Message. WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
' Create a binding and set the security mode to Message. Dim b As New WSHttpBinding(SecurityMode.Message)
Crie duas Type variáveis, uma para cada tipo de contrato e outra para o contrato implementado, conforme mostrado no código a seguir.
Type contractType = typeof(ICalculator); Type implementedContract = typeof(Calculator);
Dim contractType = GetType(ICalculator) Dim implementedContract = GetType(Calculator)
Crie uma instância da Uri classe para o endereço base do serviço. Como o usa o transporte HTTP, o URI (Uniform Resource Identifier) deve começar com esse esquema ou o
WSHttpBinding
Windows Communication Foundation (WCF) lançará uma exceção quando o serviço for aberto.Uri baseAddress = new Uri("http://localhost:8044/base");
Dim baseAddress As New Uri("http://localhost:8044/base")
Crie uma nova instância da classe com a variável de tipo de contrato implementada ServiceHost e o URI.
ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
Dim sh As New ServiceHost(implementedContract, baseAddress)
Adicione um ServiceEndpoint ao serviço usando o AddServiceEndpoint método. Passe o contrato, a vinculação e um endereço de ponto de extremidade para o construtor, conforme mostrado no código a seguir.
sh.AddServiceEndpoint(contractType, b, "Calculator");
sh.AddServiceEndpoint(contractType, b, "Calculator")
Opcional. Para recuperar metadados do serviço, crie um novo ServiceMetadataBehavior objeto e defina a HttpGetEnabled propriedade como
true
.ServiceMetadataBehavior sm = new ServiceMetadataBehavior(); sm.HttpGetEnabled = true; sh.Description.Behaviors.Add(sm);
Dim sm As New ServiceMetadataBehavior() sm.HttpGetEnabled = True With sh .Description.Behaviors.Add(sm)
Use o SetCertificate método da X509CertificateRecipientServiceCredential classe para adicionar o certificado válido ao serviço. O método pode usar um dos vários métodos para localizar um certificado. Este exemplo usa a FindBySubjectName enumeração. A enumeração especifica que o valor fornecido é o nome da entidade para a qual o certificado foi emitido.
sh.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine ,StoreName.My, X509FindType.FindBySubjectName ,"localhost");
.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _ StoreName.My, _ X509FindType.FindBySubjectName, _ "localhost")
Chame o Open método para iniciar a escuta do serviço. Se você estiver criando um aplicativo de console, chame o ReadLine método para manter o serviço no estado de escuta.
sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
.Open() Console.WriteLine("Listening") Console.ReadLine()
Exemplo
O exemplo a seguir usa o SetCertificate método para configurar um serviço com um certificado X.509.
// Create a binding and set the security mode to Message.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
Type contractType = typeof(ICalculator);
Type implementedContract = typeof(Calculator);
Uri baseAddress = new Uri("http://localhost:8044/base");
ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
sh.AddServiceEndpoint(contractType, b, "Calculator");
ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
sm.HttpGetEnabled = true;
sh.Description.Behaviors.Add(sm);
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine ,StoreName.My,
X509FindType.FindBySubjectName ,"localhost");
sh.Open();
Console.WriteLine("Listening");
Console.ReadLine();
sh.Close();
' Create a binding and set the security mode to Message.
Dim b As New WSHttpBinding(SecurityMode.Message)
Dim contractType = GetType(ICalculator)
Dim implementedContract = GetType(Calculator)
Dim baseAddress As New Uri("http://localhost:8044/base")
Dim sh As New ServiceHost(implementedContract, baseAddress)
sh.AddServiceEndpoint(contractType, b, "Calculator")
Dim sm As New ServiceMetadataBehavior()
sm.HttpGetEnabled = True
With sh
.Description.Behaviors.Add(sm)
.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
StoreName.My, _
X509FindType.FindBySubjectName, _
"localhost")
.Open()
Console.WriteLine("Listening")
Console.ReadLine()
.Close()
End With
Compilando o código
Os namespaces a seguir são necessários para compilar o código: