Dela via


Anvisningar: Konfigurera en port med ett SSL-certifikat

När du skapar en lokalt installerad Windows Communication Foundation-tjänst (WCF) med klassen WSHttpBinding som använder transportsäkerhet måste du även konfigurera en port med ett X.509-certifikat. Om du inte skapar en lokalt installerad tjänst kan du vara värd för din tjänst på Internet Information Services (IIS). Mer information finns i HTTP Transport Security.

För att konfigurera en port beror verktyget du använder på det operativsystem som körs på datorn.

Om du kör Windows Server 2003 använder du verktyget HttpCfg.exe. På Windows Server 2003 installeras det här verktyget. Mer information finns i Översikt över Httpcfg. Dokumentationen om Windows Support Tools förklarar syntaxen för Httpcfg.exe-verktyget.

Om du kör Windows Vista använder du verktyget Netsh.exe som redan är installerat.

Kommentar

För att ändra certifikat som lagras på datorn krävs administratörsbehörighet.

Fastställa hur portar konfigureras

  1. I Windows Server 2003 eller Windows XP använder du verktyget HttpCfg.exe för att visa den aktuella portkonfigurationen med hjälp av frågan och SSL-växlar , som du ser i följande exempel.

    httpcfg query ssl  
    
  2. I Windows Vista använder du verktyget Netsh.exe för att visa den aktuella portkonfigurationen, som du ser i följande exempel.

    netsh http show sslcert  
    

Hämta ett certifikats tumavtryck

  1. Använd MMC-snapin-modulen Certifikat för att hitta ett X.509-certifikat som har ett avsett syfte med klientautentisering. Mer information finns i Så här visar du certifikat med MMC-snapin-modulen.

  2. Få åtkomst till certifikatets tumavtryck. Mer information finns i How to: Retrieve the Thumbprint of a Certificate (Gör så här: Hämta tumavtrycket för ett certifikat).

  3. Kopiera tumavtrycket för certifikatet till en textredigerare, till exempel Anteckningar.

  4. Ta bort alla blanksteg mellan hexadecimala tecken. Ett sätt att åstadkomma detta är att använda textredigerarens find-and-replace-funktion och ersätta varje blanksteg med ett null-tecken.

Binda ett SSL-certifikat till ett portnummer

  1. I Windows Server 2003 eller Windows XP använder du verktyget HttpCfg.exe i "set"-läge i SSL-arkivet (Secure Sockets Layer) för att binda certifikatet till ett portnummer. Verktyget använder tumavtrycket för att identifiera certifikatet, enligt följande exempel.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
    • Växeln -i har syntaxen IP:port och instruerar verktyget att ange certifikatet till port 8012 för datorn. Du kan också ersätta de fyra nollor som föregår talet med datorns faktiska IP-adress.

    • Växeln -h anger tumavtrycket för certifikatet.

  2. I Windows Vista använder du verktyget Netsh.exe, som du ser i följande exempel.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
    
    • Parametern certhash anger tumavtrycket för certifikatet.

    • Parametern ipport anger IP-adressen och porten och fungerar precis som växeln -i för det Httpcfg.exe som beskrivs.

    • Appid-parametern är ett GUID som kan användas för att identifiera det ägande programmet.

Binda ett SSL-certifikat till ett portnummer och stöd för klientcertifikat

  1. I Windows Server 2003 eller Windows XP, för att stödja klienter som autentiserar med X.509-certifikat på transportlagret, följer du föregående procedur men skickar ytterligare en kommandoradsparameter till HttpCfg.exe, som du ser i följande exempel.

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

    Växeln -f har syntaxen n för var n är ett tal mellan 1 och 7. Värdet 2, som visas i föregående exempel, aktiverar klientcertifikat på transportskiktet. Värdet 3 aktiverar klientcertifikat och mappar dessa certifikat till ett Windows-konto. Mer information om andra värden finns i HttpCfg.exe Hjälp.

  2. Om du vill stödja klienter som autentiserar med X.509-certifikat på transportlagret i Windows Vista följer du föregående procedur, men med ytterligare en parameter, som du ser i följande exempel.

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

Ta bort ett SSL-certifikat från ett portnummer

  1. Använd verktyget HttpCfg.exe eller Netsh.exe för att se portar och tumavtryck för alla bindningar på datorn. Om du vill skriva ut informationen till disken använder du omdirigeringstecknet ">", som du ser i följande exempel.

    httpcfg query ssl>myMachinePorts.txt  
    
  2. I Windows Server 2003 eller Windows XP använder du verktyget HttpCfg.exe med nyckelorden delete och ssl . Använd växeln -i för att ange IP:port tal och -h-växeln för att ange tumavtrycket.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
  3. I Windows Vista använder du verktyget Netsh.exe, som du ser i följande exempel.

    Netsh http delete sslcert ipport=0.0.0.0:8005  
    

Exempel

Följande kod visar hur du skapar en lokalt installerad tjänst med hjälp av WSHttpBinding klassen inställd på transportsäkerhet. När du skapar ett program anger du portnumret i adressen.

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

Se även