Procédure : configurer un port avec un certificat SSL

Lors de la création d’un service Windows Communication Foundation (WCF) auto-hébergé avec la classe WSHttpBinding qui utilise la sécurité de transport, vous devez aussi configurer un port avec un certificat X.509. Si vous ne créez pas de service auto-hébergé, vous pouvez héberger votre service sur les services Internet (IIS). Pour plus d’informations, consultez Sécurité du transport HTTP.

Pour configurer un port, l'outil que vous utilisez dépend du système d'exploitation qui s'exécute sur votre ordinateur.

Si vous exécutez Windows Server 2003, utilisez l’outil HttpCfg.exe. Sur Windows Server 2003, cet outil est installé. Pour plus d’informations, consultez Vue d’ensemble de Httpcfg. La documentation des outils de support de Windows explique la syntaxe de l’outil Httpcfg.exe.

Si vous exécutez Windows Vista, utilisez l’outil Netsh.exe qui est déjà installé.

Notes

La modification des certificats stockés sur l’ordinateur requiert des privilèges d’administrateur.

Déterminer comment sont configurés les ports

  1. Dans Windows Server 2003 ou Windows XP, utilisez l’outil HttpCfg.exe pour consulter la configuration de port actuelle, à l’aide des commutateurs query et ssl, comme indiqué dans l’exemple suivant.

    httpcfg query ssl  
    
  2. Dans Windows Vista, utilisez l’outil Netsh.exe pour consulter la configuration de port actuelle, comme indiqué dans l’exemple suivant.

    netsh http show sslcert  
    

Obtenir l’empreinte d’un certificat

  1. Utilisez le composant logiciel enfichable MMC Certificats pour rechercher un certificat X.509 ayant pour objectif l'authentification du client. Pour plus d’informations, consultez la page Affichage de certificats à l’aide du composant logiciel enfichable MMC.

  2. Accédez à l'empreinte numérique du certificat. Pour plus d’informations, consultez l’article Comment : récupérer l’empreinte numérique d’un certificat.

  3. Copiez l'empreinte numérique du certificat dans un éditeur de texte, tel que le Bloc-notes.

  4. Supprimez tous les espaces entre les caractères hexadécimaux. Pour ce faire, vous pouvez utiliser la fonctionnalité rechercher et remplacer de l’éditeur de texte pour remplacer chaque espace par un caractère Null.

Lier un certificat SSL à un numéro de port

  1. Dans Windows Server 2003 ou Windows XP, utilisez l’outil HttpCfg.exe en mode « défini » dans le magasin SSL (Secure Sockets Layer) pour lier le certificat à un numéro de port. L'outil utilise l'empreinte numérique pour identifier le certificat, comme indiqué dans l'exemple suivant.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
    • Le commutateur -i adopte la syntaxe IP:port et indique à l’outil d’affecter au certificat le port 8012 de l’ordinateur. Le cas échéant, les quatre zéros qui précédent le nombre peuvent aussi être remplacés par l'adresse IP réelle de l'ordinateur.

    • Le commutateur -h spécifie l’empreinte du certificat.

  2. Dans Windows Vista, utilisez l’outil Netsh.exe, comme indiqué dans l’exemple suivant.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
    
    • Le paramètre certhash spécifie l’empreinte du certificat.

    • Le paramètre ipport spécifie l’adresse IP et le port, ainsi que des fonctions comme le commutateur -i de l’outil Httpcfg.exe décrit.

    • Le paramètre appid est un GUID qui peut être utilisé pour identifier l’application propriétaire.

Lier un certificat SSL à un numéro de port et prendre en charge les certificats clients

  1. Dans Windows Server 2003 ou Windows XP, pour prendre en charge les clients qui s’authentifient avec des certificats X.509 au niveau de la couche de transport, suivez la procédure précédente, mais passez un paramètre de ligne de commande supplémentaire à HttpCfg.exe, comme indiqué dans l’exemple suivant.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6 -f 2  
    

    Le commutateur -f adopte la syntaxe n, où n est un nombre compris entre 1 et 7. Une valeur de 2, comme indiqué dans l'exemple précédent, active des certificats clients au niveau de la couche de transport. La valeur 3 active les certificats clients et mappe ces certificats à un compte Windows. Consultez l'aide de HttpCfg.exe pour connaître le comportement des autres valeurs.

  2. Dans Windows Vista, pour prendre en charge les clients qui s’authentifient avec des certificats X.509 au niveau de la couche de transport, suivez la procédure précédente, mais avec un paramètre supplémentaire, comme indiqué dans l’exemple suivant.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF} clientcertnegotiation=enable  
    

Supprimer un certificat SSL d’un numéro de port

  1. Utilisez l’outil HttpCfg.exe ou Netsh.exe pour consulter les ports et les empreintes numériques de toutes les liaisons sur l’ordinateur. Pour imprimer les informations sur le disque, utilisez le caractère de redirection « > », comme indiqué dans l’exemple suivant.

    httpcfg query ssl>myMachinePorts.txt  
    
  2. Dans Windows Server 2003 ou Windows XP, utilisez l’outil HttpCfg.exe avec les mots clés delete et ssl. Utilisez le commutateur -i pour spécifier le numéro IP:port, et le commutateur -h pour spécifier l’empreinte numérique.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
  3. Dans Windows Vista, utilisez l’outil Netsh.exe, comme indiqué dans l’exemple suivant.

    Netsh http delete sslcert ipport=0.0.0.0:8005  
    

Exemple

Le code suivant montre comment créer un service auto-hébergé à l'aide de la classe WSHttpBinding à laquelle est attribuée la sécurité de transport. Lorsque vous créez une application, spécifiez le numéro de port dans l'adresse.

// This string uses a function to prepend the computer name at run time.
string addressHttp = String.Format(
    "http://{0}:8080/Calculator",
    System.Net.Dns.GetHostEntry("").HostName);

WSHttpBinding b = new WSHttpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

// You must create an array of URI objects to have a base address.
Uri a = new Uri(addressHttp);
Uri[] baseAddresses = new Uri[] { a };

// Create the ServiceHost. The service type (Calculator) is not
// shown here.
ServiceHost sh = new ServiceHost(typeof(Calculator), baseAddresses);

// Add an endpoint to the service. Insert the thumbprint of an X.509
// certificate found on your computer.
Type c = typeof(ICalculator);
sh.AddServiceEndpoint(c, b, "MyCalculator");
sh.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindBySubjectName,
    "contoso.com");

// This next line is optional. It specifies that the client's certificate
// does not have to be issued by a trusted authority, but can be issued
// by a peer if it is in the Trusted People store. Do not use this setting
// for production code. The default is PeerTrust, which specifies that
// the certificate must originate from a trusted certificate authority.

// sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
// X509CertificateValidationMode.PeerOrChainTrust;
try
{
    sh.Open();

    string address = sh.Description.Endpoints[0].ListenUri.AbsoluteUri;
    Console.WriteLine("Listening @ {0}", address);
    Console.WriteLine("Press enter to close the service");
    Console.ReadLine();
    sh.Close();
}
catch (CommunicationException ce)
{
    Console.WriteLine("A communication error occurred: {0}", ce.Message);
    Console.WriteLine();
}
catch (System.Exception exc)
{
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message);
    Console.ReadLine();
}
' This string uses a function to prepend the computer name at run time.
Dim addressHttp As String = String.Format("http://{0}:8080/Calculator", _
System.Net.Dns.GetHostEntry("").HostName)

Dim b As New WSHttpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate

' You must create an array of URI objects to have a base address.
Dim a As New Uri(addressHttp)
Dim baseAddresses() As Uri = {a}

' Create the ServiceHost. The service type (Calculator) is not
' shown here.
Dim sh As New ServiceHost(GetType(Calculator), baseAddresses)

' Add an endpoint to the service. Insert the thumbprint of an X.509 
' certificate found on your computer. 
Dim c As Type = GetType(ICalculator)
sh.AddServiceEndpoint(c, b, "MyCalculator")
sh.Credentials.ServiceCertificate.SetCertificate( _
                StoreLocation.LocalMachine, _
                StoreName.My, _
                X509FindType.FindBySubjectName, _
                "contoso.com")

' This next line is optional. It specifies that the client's certificate
' does not have to be issued by a trusted authority, but can be issued
' by a peer if it is in the Trusted People store. Do not use this setting
' for production code. The default is PeerTrust, which specifies that 
' the certificate must originate from a trusted certificate authority.
' sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
' X509CertificateValidationMode.PeerOrChainTrust
Try
    sh.Open()

    Dim address As String = sh.Description.Endpoints(0).ListenUri.AbsoluteUri
    Console.WriteLine("Listening @ {0}", address)
    Console.WriteLine("Press enter to close the service")
    Console.ReadLine()
    sh.Close()
Catch ce As CommunicationException
    Console.WriteLine("A communication error occurred: {0}", ce.Message)
    Console.WriteLine()
Catch exc As System.Exception
    Console.WriteLine("An unforeseen error occurred: {0}", exc.Message)
    Console.ReadLine()
End Try

Voir aussi