Procedura: proteggere un servizio con un certificato X.509

La protezione di un servizio con un certificato X.509 è una tecnica di base usata dalla maggior parte dei binding in Windows Communication Foundation (WCF). In questo argomento vengono illustrati i passaggi di configurazione di un servizio indipendente con un certificato X.509.

Un prerequisito è un certificato valido utilizzabile per autenticare il server. Il certificato deve essere emesso al server da un autorità di certificazione attendibile. Se il certificato non è valido, nessun client che tenti di utilizzare il servizio lo reputerà attendibile e, di conseguenza, non verrà stabilita nessuna connessione. Per altre informazioni sull'uso di certificati, vedere Working with Certificates.

Per configurare un servizio con un certificato utilizzando codice.

  1. Creare il contratto di servizio e il servizio implementato. Per altre informazioni, vedere Progettazione e implementazione di servizi.

  2. Creare un'istanza della classe WSHttpBinding e impostarne la modalità sicura su Message, come illustrato nel codice seguente.

    // 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)
    
  3. Creare due variabili Type, una per il tipo di contratto e una per il contratto implementato, come illustrato nel codice seguente.

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. Creare un'istanza della classe Uri per l'indirizzo di base del servizio. Dato che WSHttpBinding utilizza il trasporto HTTP, l'Uniform Resource Identifier (URI) deve iniziare con quello schema. In caso contrario, WCF (Windows Communication Foundation) genererà un'eccezione all'apertura del servizio.

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. Creare una nuova istanza della classe ServiceHost con la variabile del tipo di contratto implementato e l'URI.

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. Aggiungere un ServiceEndpoint al servizio utilizzando il metodo AddServiceEndpoint. Passare il contratto, l'associazione e un indirizzo endpoint al costruttore, come illustrato nel codice seguente.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Facoltativo. Per recuperare metadati dal servizio, creare un nuovo oggetto ServiceMetadataBehavior e impostare la proprietà HttpGetEnabled su 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)
    
  8. Utilizzare il metodo SetCertificate della classe X509CertificateRecipientServiceCredential per aggiungere il certificato valido al servizio. Il metodo può utilizzare uno di numerosi metodi per trovare un certificato. Nell'esempio viene utilizzata l'enumerazione FindBySubjectName. L'enumerazione specifica che il valore fornito è il nome dell'entità alla quale è stato emesso il certificato.

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. Chiamare il metodo Open per avviare l'ascolto del servizio. Se si sta creando un'applicazione console, chiamare il metodo ReadLine per tenere il servizio nello stato di ascolto.

    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    .Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Esempio

Nell'esempio seguente viene utilizzato il metodo SetCertificate per configurare un servizio con un certificato 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

Compilazione del codice

Per compilare il codice sono necessari gli spazi dei nomi seguenti:

Vedi anche