Procedimiento para proteger un servicio con un certificado X.509
La protección de un servicio con un certificado X.509 es una técnica básica que usan la mayoría de los enlaces en Windows Communication Foundation (WCF). En este tema se describen los pasos necesarios para configurar un servicio autoalojado con un certificado X.509.
Un requisito previo es un certificado válido que se puede utilizar para autenticar el servidor. Una entidad emisora de certificados de confianza debe emitir el certificado. Si el certificado no es válido, cualquier cliente que intente usar el servicio no confiará en el servicio y, por tanto, no se realizará ninguna conexión. Para obtener más información sobre el uso de certificados, consulte Trabajar con certificados.
Configuración de un servicio con un certificado mediante código
Cree el contrato de servicio y el servicio implementado. Para obtener más información, consulte Diseño e implementación de servicios.
Cree una instancia de la clase WSHttpBinding y establezca su modo de seguridad en Message, tal y como se muestra en el código siguiente.
// 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)
Cree dos variables Type, una para el tipo de contrato y otra para el contrato implementado, tal y como se muestra en el código siguiente.
Type contractType = typeof(ICalculator); Type implementedContract = typeof(Calculator);
Dim contractType = GetType(ICalculator) Dim implementedContract = GetType(Calculator)
Cree una instancia de la clase Uri para la dirección base del servicio. Dado que el
WSHttpBinding
usa el transporte HTTP, el identificador uniforme de recursos (URI) debe comenzar con ese esquema o Windows Communication Foundation (WCF) producirá una excepción cuando se abra el servicio.Uri baseAddress = new Uri("http://localhost:8044/base");
Dim baseAddress As New Uri("http://localhost:8044/base")
Cree una nueva instancia de la clase ServiceHost con la variable del tipo de contrato implementado y el URI.
ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
Dim sh As New ServiceHost(implementedContract, baseAddress)
Agregue un ServiceEndpoint al servicio mediante el método AddServiceEndpoint. Pase el contrato, enlace y una dirección del extremo al constructor, tal y como se muestra en el código siguiente.
sh.AddServiceEndpoint(contractType, b, "Calculator");
sh.AddServiceEndpoint(contractType, b, "Calculator")
Opcional. Para recuperar los metadatos del servicio, cree un nuevo objeto ServiceMetadataBehavior y establezca la propiedad HttpGetEnabled en
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 el método SetCertificate de la clase X509CertificateRecipientServiceCredential para agregar al servicio el certificado válido. El método puede utilizar un método de varios para encontrar un certificado. Este ejemplo usa la enumeración FindBySubjectName. La enumeración especifica que el valor proporcionado es el nombre de la entidad a la que se emitió el certificado.
sh.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine ,StoreName.My, X509FindType.FindBySubjectName ,"localhost");
.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _ StoreName.My, _ X509FindType.FindBySubjectName, _ "localhost")
Llame al método Open para iniciar la escucha del servicio. Si está creando una aplicación de consola, llame al método ReadLine para mantener el servicio en el estado de escucha.
sh.Open(); Console.WriteLine("Listening"); Console.ReadLine();
.Open() Console.WriteLine("Listening") Console.ReadLine()
Ejemplo
El ejemplo siguiente utiliza el método SetCertificate para configurar un servicio con un 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
Compilar el código
Los espacios de nombres siguientes son necesarios para compilar el código: