Partager via


Comment : configurer un port avec un certificat SSL

Lors de la création d'un service Windows Communication Foundation (WCF) auto-hébergé à l'aide de 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é de 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 ou Windows XP, utilisez l'outil HttpCfg.exe. Avec Windows Server 2003, cet outil est installé. Avec Windows XP, vous pouvez télécharger l'outil à partir de la page Outils de support Windows XP Service Pack 2. Pour plus d'informations, consultez Vue d'ensemble de Httpcfg. La documentation Outils de prise en charge Windows (page pouvant être en anglais) explique la syntaxe de l'outil Httpcfg.exe.

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

Cette rubrique décrit comment exécuter plusieurs procédures :

  • Détermination de la configuration de port actuelle d'un ordinateur.

  • Obtention de l'empreinte numérique d'un certificat (nécessaire pour les deux procédures suivantes).

  • Liaison d'un certificat SSL à une configuration de port.

  • Liaison d'un certificat SSL à une configuration de port et prise en charge des certificats clients.

  • Suppression d'un certificat SSL d'un numéro de port.

Notez que la modification des certificats stockés sur l'ordinateur requiert des privilèges d'administrateur.

Pour 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
    

Pour obtenir l'empreinte numérique 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 Comment : afficher des certificats à l'aide du composant logiciel enfichable MMC.

  2. Accédez à l'empreinte numérique du certificat. Pour plus d'informations, consultez 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.

Pour 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 numérique 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 numérique du certificat.

    • Le paramètre ipport spécifie l'adresse IP et le port ainsi que des fonctions, tout comment 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.

Pour 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 authentifiés avec les 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 présente la syntaxe de 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 authentifiés avec les 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
    

Pour 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.
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 certifiate 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 commmunication error occurred: {0}", ce.Message)
    Console.WriteLine()
Catch exc As System.Exception
    Console.WriteLine("An unforseen error occurred: {0}", exc.Message)
    Console.ReadLine()
End Try
// 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 certifiate 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 commmunication error occurred: {0}", ce.Message);
    Console.WriteLine();
}
catch (System.Exception exc)
{
    Console.WriteLine("An unforseen error occurred: {0}", exc.Message);
    Console.ReadLine();
}

Voir aussi

Concepts

Sécurité de transport HTTP