Procédure : sécuriser un service avec un certificat X.509

La sécurisation d’un service avec un certificat X.509 est une technique de base qui est utilisée par la plupart des liaisons dans Windows Communication Foundation (WCF). Cette rubrique décrit les étapes de la configuration d'un service auto-hébergé avec un certificat X.509.

L'une des conditions préalables est de disposer d'un certificat valide pouvant être utilisé pour authentifier le serveur. Le certificat doit être envoyé au serveur par une autorité de certification approuvée. Si le certificat n'est pas valide, les clients qui essayeront d'utiliser le service ne lui feront pas confiance, et par conséquent aucune connexion ne sera établie. Pour plus d’informations sur l’utilisation des certificats, consultez Utilisation des certificats.

Pour configurer un service avec un certificat à l'aide du code

  1. Créez le contrat de service et le service implémenté. Pour plus d'informations, consultez Conception et implémentation de services.

  2. Créez une instance de la classe WSHttpBinding et affectez Message à son mode de sécurité, tel qu'indiqué dans le code suivant.

    // 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. Créez deux variables Type, une pour le type de contrat et l'autre pour le contrat implémenté, tel qu'indiqué dans le code suivant.

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. Créez une instance de la classe Uri pour l'adresse de base du service. Comme WSHttpBinding utilise le transport HTTP, l'URI (Uniform Resource Identifier) doit commencer par ce schéma ; sinon, Windows Communication Foundation (WCF) lèvera une exception à l'ouverture du service.

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. Créez une nouvelle instance de la classe ServiceHost avec la variable de type de contrat implémentée et l'URI.

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. Ajoutez ServiceEndpoint au service à l'aide de la méthode AddServiceEndpoint. Transmettez le contrat, la liaison et une adresse de point de terminaison au constructeur, tel qu'indiqué dans le code suivant.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Optionnel. Pour récupérer les métadonnées du service, créez un objet ServiceMetadataBehavior et affectez HttpGetEnabled à la propriété 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. Utilisez la méthode SetCertificate de la classe X509CertificateRecipientServiceCredential pour ajouter le certificat valide au service. La méthode peut utiliser l'une des nombreuses options disponibles pour rechercher un certificat. Cet exemple utilise l'énumération FindBySubjectName. L'énumération spécifie que la valeur fournie est le nom de l'entité à laquelle le certificat a été envoyé.

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. Appelez la méthode Open pour commencer l'écoute du service. Si vous créez une application console, appelez la méthode ReadLine pour maintenir l'écoute du service.

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

Exemple

L'exemple suivant utilise la méthode SetCertificate pour configurer un service avec un certificat 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

Compilation du code

Les espaces de noms suivants sont requis pour compiler le code :

Voir aussi