Vorgehensweise: Konfigurieren eines Anschlusses mit einem SSL-Zertifikat

Beim Erstellen eines selbst gehosteten Windows Communication Foundation-Diensts (WCF) mit der WSHttpBinding-Klasse, die die Transportsicherheit verwendet, müssen Sie auch einen Anschluss mit einem X.509-Zertifikat konfigurieren. Wenn Sie keinen selbst gehosteten Dienst erstellen, können Sie Ihren Dienst auch über Internetinformationsdienste (IIS) hosten. Weitere Informationen finden Sie unter HTTP-Transportsicherheit.

Welches Tool zum Konfigurieren eines Anschlusses verwendet wird, hängt vom Betriebssystem des Computers ab.

Wenn Sie Windows Server 2003 ausführen, verwenden Sie das Tool „HttpCfg.exe“. Dieses Tool wird unter Windows Server 2003 installiert. Weitere Informationen finden Sie unter Httpcfg-Übersicht. In der Dokumentation der Windows-Supporttools wird die Syntax des Tools „Httpcfg.exe“ erläutert.

Verwenden Sie unter Windows Vista das bereits installierte Tool „Netsh.exe“.

Hinweis

Zum Ändern der auf dem Computer gespeicherten Zertifikate sind Administratorrechte erforderlich.

Ermitteln, wie Anschlüsse konfiguriert sind

  1. Verwenden Sie unter Windows Server 2003 oder Windows XP zum Anzeigen der aktuellen Anschlusskonfiguration das „HttpCfg.exe“-Tool mit den Optionen query und ssl, wie im folgenden Beispiel gezeigt:

    httpcfg query ssl  
    
  2. Verwenden Sie zum Anzeigen der aktuellen Anschlusskonfiguration unter Windows Vista das „Netsh.exe“-Tool, wie im folgenden Beispiel gezeigt.

    netsh http show sslcert  
    

Abrufen des Zertifikatfingerabdrucks

  1. Verwenden Sie das Zertifikats-MMC-Snap-In, um nach einem X.509-Zertifikat zu suchen, das eine bestimmte Clientauthentifizierungsfunktion aufweist. Weitere Informationen finden Sie unter Vorgehensweise: Anzeigen von Zertifikaten mit dem MMC-Snap-In.

  2. Greifen Sie auf den Fingerabdruck des Zertifikats zu. Weitere Informationen finden Sie unter Vorgehensweise: Abrufen des Fingerabdrucks eines Zertifikats.

  3. Kopieren Sie den Fingerabdruck des Zertifikats in einen Texteditor, beispielsweise den Windows-Editor.

  4. Entfernen Sie alle Leerstellen zwischen den Hexadezimalzeichen. Eine Möglichkeit besteht darin, die Suchen/Ersetzen-Funktion des Editors zu nutzen, um jede Leerstelle durch ein NULL-Zeichen zu ersetzen.

Binden eines SSL-Zertifikats an eine Anschlussnummer

  1. Verwenden Sie unter Windows Server 2003 oder unter Windows XP das Tool „HttpCfg.exe“ im SSL-Speicher (Secure Sockets Layer ) im Modus „set“, um das Zertifikat an eine Anschlussnummer zu binden. Das Tool verwendet den Fingerabdruck, um das Zertifikat zu identifizieren, wie im folgenden Beispiel gezeigt.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
    • Die Option -i hat die Syntax IP:port und weist das Tool an, das Zertifikat auf den Port 8012 des Computers festzulegen. Optional können Sie die vier Nullen vor der Nummer auch durch die tatsächliche IP-Adresse des Computers ersetzen.

    • Die Option -h gibt den Fingerabdruck des Zertifikats an.

  2. Verwenden Sie unter Windows Vista das „Netsh.exe“-Tool, wie im folgenden Beispiel gezeigt.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00001111-aaaa-2222-bbbb-3333cccc4444}
    
    • Der certhash-Parameter gibt den Fingerabdruck des Zertifikats an.

    • Die ipport-Option gibt IP-Adresse und den Port an und funktioniert genau wie das beschriebene -i-Option des „Httpcfg.exe“-Tools.

    • Der appid-Parameter ist eine GUID, die verwendet werden kann, um die besitzende Anwendung zu identifizieren.

Binden eines SSL-Zertifikats an eine Portnummer und unterstützen Clientzertifikate

  1. Führen Sie zum Unterstützen von Clients, die die Authentifizierung mithilfe von X.509-Zertifikaten auf der Transportebene durchführen, unter Windows Server 2003 oder Windows XP die obige Prozedur aus, übergeben Sie jedoch einen zusätzlichen Befehlszeilenparameter an „HttpCfg.exe“, wie im folgenden Beispiel gezeigt:

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

    Die Option -f hat die Syntax n, wobei n eine Zahl zwischen 1 und 7 ist. Bei dem Wert "2" (wie im vorherigen Beispiel gezeigt) sind Clientzertifikate auf der Transportebene aktiviert. Der Wert "3" aktiviert Clientzertifikate und ordnet die Zertifikate einem Windows-Konto zu. Das Verhalten bei anderen Werten finden Sie in der Hilfe zu HttpCfg.exe.

  2. Führen Sie zum Unterstützen von Clients, die die Authentifizierung mithilfe von X.509-Zertifikaten auf der Transportebene durchführen, unter Windows Vista die obige Prozedur aus, verwenden Sie jedoch einen zusätzlichen Parameter, wie im folgenden Beispiel gezeigt:

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

Löschen eines SSL-Zertifikats aus einer Portnummer

  1. Verwenden Sie das HttpCfg.exe- oder das Netsh.exe-Tool, um die Anschlüsse und Fingerabdrücke aller Bindungen auf dem Computer anzuzeigen. Verwenden Sie das Umleitungszeichen „>“, um die Informationen auf den Datenträger auszugeben, wie im folgenden Beispiel gezeigt:

    httpcfg query ssl>myMachinePorts.txt  
    
  2. Verwenden Sie in Windows Server 2003 oder Windows XP das „HttpCfg.exe“-Tool mit den Schlüsselwörtern delete und ssl. Verwenden Sie die Option -i, um die IP:port-Nummer anzugeben, und die Option -h, um den Fingerabdruck anzugeben.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
  3. Verwenden Sie unter Windows Vista das „Netsh.exe“-Tool, wie im folgenden Beispiel gezeigt.

    Netsh http delete sslcert ipport=0.0.0.0:8005  
    

Beispiel

Der folgende Code zeigt, wie Sie einen selbst gehosteten Dienst erstellen, indem Sie die auf die Transportsicherheit festgelegte WSHttpBinding-Klasse verwenden. Geben Sie beim Erstellen einer Anwendung die Anschlussnummer in der Adresse an.

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

Siehe auch