Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez aussi afficher la version anglaise dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte.
Traduction
Anglais

Comment : 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 que la plupart des liaisons dans Windows Communication Foundation (WCF) utilisent.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 de 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, consultezConception 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);
    
  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);
    
  4. Créez une instance de la classe Uri pour l'adresse de base du service. WSHttpBinding utilisant le transport HTTP, l'URI (Uniform Resource Identifier) doit commencer par ce schéma, sinon Windows Communication Foundation (WCF) lèvera une exception lors de l'ouverture du service.

    Uri baseAddress = 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);
    
  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");
    
  7. Facultatif.Pour récupérer les métadonnées du service, créez un objet ServiceMetadataBehavior et affectez true à la propriété HttpGetEnabled.

    ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
    sm.HttpGetEnabled = true;
    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");
    
  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();
    

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();
Afficher: