Delen via


Procedure: Een poort configureren met een SSL-certificaat

Wanneer u een zelf-hostende WCF-service (Windows Communication Foundation) maakt met de WSHttpBinding klasse die gebruikmaakt van transportbeveiliging, moet u ook een poort configureren met een X.509-certificaat. Als u geen zelf-hostende service maakt, kunt u uw service hosten op IIS (Internet Information Services). Zie HTTP Transport Security voor meer informatie.

Als u een poort wilt configureren, is het hulpprogramma dat u gebruikt, afhankelijk van het besturingssysteem dat op uw computer wordt uitgevoerd.

Als u Windows Server 2003 gebruikt, gebruikt u het hulpprogramma HttpCfg.exe. Op Windows Server 2003 is dit hulpprogramma geïnstalleerd. Zie Httpcfg-overzicht voor meer informatie. In de documentatie over Windows-ondersteuningshulpprogramma's wordt de syntaxis voor het hulpprogramma Httpcfg.exe uitgelegd.

Als u Windows Vista gebruikt, gebruikt u het hulpprogramma Netsh.exe dat al is geïnstalleerd.

Notitie

Voor het wijzigen van certificaten die op de computer zijn opgeslagen, zijn beheerdersbevoegdheden vereist.

Bepalen hoe poorten zijn geconfigureerd

  1. Gebruik in Windows Server 2003 of Windows XP het hulpprogramma HttpCfg.exe om de huidige poortconfiguratie weer te geven met behulp van de query - en SSL-switches , zoals wordt weergegeven in het volgende voorbeeld.

    httpcfg query ssl  
    
  2. Gebruik in Windows Vista het hulpprogramma Netsh.exe om de huidige poortconfiguratie weer te geven, zoals wordt weergegeven in het volgende voorbeeld.

    netsh http show sslcert  
    

Vingerafdruk van een certificaat ophalen

  1. Gebruik de MMC-module Certificaten om een X.509-certificaat te vinden dat een bedoeld doel heeft voor clientverificatie. Zie Instructies voor meer informatie : Certificaten weergeven met de MMC-module.

  2. Open de vingerafdruk van het certificaat. Zie voor meer informatie De vingerafdruk van een certificaat ophalen.

  3. Kopieer de vingerafdruk van het certificaat naar een teksteditor, zoals Kladblok.

  4. Verwijder alle spaties tussen de hexadecimale tekens. Een manier om dit te bereiken is door de functie zoeken en vervangen van de teksteditor te gebruiken en elke spatie te vervangen door een null-teken.

Een SSL-certificaat binden aan een poortnummer

  1. Gebruik in Windows Server 2003 of Windows XP het hulpprogramma HttpCfg.exe in de modus Instellen in het SSL-archief (Secure Sockets Layer) om het certificaat te binden aan een poortnummer. Het hulpprogramma gebruikt de vingerafdruk om het certificaat te identificeren, zoals wordt weergegeven in het volgende voorbeeld.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
    • De schakeloptie -i heeft de syntaxis van IP:port en geeft het hulpprogramma de opdracht om het certificaat in te stellen op poort 8012 van de computer. Desgewenst kunnen de vier nullen die voorafgaan aan het getal ook worden vervangen door het werkelijke IP-adres van de computer.

    • De schakeloptie -h geeft de vingerafdruk van het certificaat op.

  2. Gebruik in Windows Vista het hulpprogramma Netsh.exe, zoals wordt weergegeven in het volgende voorbeeld.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00001111-aaaa-2222-bbbb-3333cccc4444}
    
    • De certhash-parameter geeft de vingerafdruk van het certificaat op.

    • De ipport-parameter specificeert het IP-adres en de poort en functies, net zoals de -i-switch van het Httpcfg.exe hulpprogramma beschreven.

    • De parameter appid is een GUID die kan worden gebruikt om de toepassing die eigenaar is te identificeren.

Een SSL-certificaat binden aan een poortnummer en clientcertificaten ondersteunen

  1. Als u in Windows Server 2003 of Windows XP clients wilt ondersteunen die worden geverifieerd met X.509-certificaten op de transportlaag, volgt u de voorgaande procedure, maar geeft u een extra opdrachtregelparameter door aan HttpCfg.exe, zoals wordt weergegeven in het volgende voorbeeld.

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

    De schakeloptie -f heeft de syntaxis van n waarbij n een getal is tussen 1 en 7. Een waarde van 2, zoals wordt weergegeven in het vorige voorbeeld, maakt clientcertificaten op de transportlaag mogelijk. Met een waarde van 3 kunnen clientcertificaten en deze certificaten worden toegewezen aan een Windows-account. Zie HttpCfg.exe Help voor het gedrag van andere waarden.

  2. Als u in Windows Vista clients wilt ondersteunen die worden geverifieerd met X.509-certificaten op de transportlaag, volgt u de voorgaande procedure, maar met een extra parameter, zoals wordt weergegeven in het volgende voorbeeld.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00001111-aaaa-2222-bbbb-3333cccc4444} clientcertnegotiation=enable  
    

Een SSL-certificaat verwijderen uit een poortnummer

  1. Gebruik het hulpprogramma HttpCfg.exe of Netsh.exe om de poorten en vingerafdrukken van alle bindingen op de computer te zien. Als u de gegevens naar schijf wilt afdrukken, gebruikt u het omleidingsteken ">", zoals wordt weergegeven in het volgende voorbeeld.

    httpcfg query ssl>myMachinePorts.txt  
    
  2. Gebruik in Windows Server 2003 of Windows XP het hulpprogramma HttpCfg.exe met de trefwoorden verwijderen en ssl . Gebruik de schakeloptie -i om het IPnummer opport te geven en de schakeloptie -h om de vingerafdruk op te geven.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
  3. Gebruik in Windows Vista het hulpprogramma Netsh.exe, zoals wordt weergegeven in het volgende voorbeeld.

    Netsh http delete sslcert ipport=0.0.0.0:8005  
    

Opmerking

De volgende code laat zien hoe u een zelf-hostende service maakt met behulp van de WSHttpBinding klasse die is ingesteld op transportbeveiliging. Wanneer u een toepassing maakt, geeft u het poortnummer op in het adres.

// 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

Zie ook