Sdílet prostřednictvím


Postupy: Konfigurace portu s certifikátem SSL

Při vytváření služby Windows Communication Foundation (WCF) v místním prostředí s WSHttpBinding třídou, která používá zabezpečení přenosu, musíte také nakonfigurovat port s certifikátem X.509. Pokud nevytvo vytváříte službu v místním prostředí, můžete ji hostovat ve službě Internetová informační služba (IIS). Další informace naleznete v tématu Zabezpečení přenosu PROTOKOLU HTTP.

Pokud chcete nakonfigurovat port, nástroj, který používáte, závisí na operačním systému, který běží na vašem počítači.

Pokud používáte Systém Windows Server 2003, použijte nástroj HttpCfg.exe. V systému Windows Server 2003 je tento nástroj nainstalován. Další informace naleznete v tématu Httpcfg Přehled. Dokumentace k nástrojům podpory systému Windows vysvětluje syntaxi nástroje Httpcfg.exe.

Pokud používáte systém Windows Vista, použijte nástroj Netsh.exe, který je již nainstalován.

Poznámka:

Úprava certifikátů uložených v počítači vyžaduje oprávnění správce.

Určení konfigurace portů

  1. V systému Windows Server 2003 nebo Windows XP pomocí nástroje HttpCfg.exe zobrazte aktuální konfiguraci portu pomocí dotazů a přepínačů SSL , jak je znázorněno v následujícím příkladu.

    httpcfg query ssl  
    
  2. V systému Windows Vista použijte nástroj Netsh.exe k zobrazení aktuální konfigurace portu, jak je znázorněno v následujícím příkladu.

    netsh http show sslcert  
    

Získání kryptografického otisku certifikátu

  1. Pomocí modulu snap-in Certifikáty konzoly MMC vyhledejte certifikát X.509, který má zamýšlený účel ověřování klientů. Další informace naleznete v tématu Postupy: Zobrazení certifikátů pomocí modulu snap-in konzoly MMC.

  2. Získejte přístup k kryptografickému otisku certifikátu. Další informace najdete v tématu Postup: Načtení kryptografického otisku certifikátu.

  3. Zkopírujte kryptografický otisk certifikátu do textového editoru, například do Poznámkový blok.

  4. Odeberte všechny mezery mezi šestnáctkovými znaky. Jedním ze způsobů, jak toho dosáhnout, je použít funkci hledání a nahrazení textového editoru a nahradit každou mezeru znakem null.

Vytvoření vazby certifikátu SSL k číslu portu

  1. V systému Windows Server 2003 nebo Windows XP použijte nástroj HttpCfg.exe v režimu set v úložišti SSL (Secure Sockets Layer) k vytvoření vazby certifikátu na číslo portu. Nástroj pomocí kryptografického otisku identifikuje certifikát, jak je znázorněno v následujícím příkladu.

    httpcfg set ssl -i 0.0.0.0:8012 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
    • Přepínač -i má syntaxi : IPport a dává nástroj pokyn nastavit certifikát na port 8012 počítače. Volitelně lze čtyři nuly, které předchází číslu, nahradit také skutečnou IP adresou počítače.

    • Přepínač -h určuje kryptografický otisk certifikátu.

  2. V systému Windows Vista použijte nástroj Netsh.exe, jak je znázorněno v následujícím příkladu.

    netsh http add sslcert ipport=0.0.0.0:8000 certhash=0000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
    
    • Parametr certhash určuje kryptografický otisk certifikátu.

    • Parametr ipport určuje IP adresu a port a funguje stejně jako přepínač -i nástroje Httpcfg.exe popsaného.

    • Parametr appid je identifikátor GUID, který lze použít k identifikaci vlastnící aplikace.

Vytvoření vazby certifikátu SSL k číslu portu a podpoře klientských certifikátů

  1. V systému Windows Server 2003 nebo Windows XP podporují klienty, kteří se ověřují pomocí certifikátů X.509 v přenosové vrstvě, postupujte podle předchozího postupu, ale předejte další parametr příkazového řádku HttpCfg.exe, jak je znázorněno v následujícím příkladu.

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

    Přepínač -f má syntaxi n , kde n je číslo mezi 1 a 7. Hodnota 2, jak je znázorněno v předchozím příkladu, umožňuje klientským certifikátům v přenosové vrstvě. Hodnota 3 umožňuje klientským certifikátům a mapuje tyto certifikáty na účet Systému Windows. Informace o chování jiných hodnot najdete v nápovědě k HttpCfg.exe.

  2. Pokud chcete v systému Windows Vista podporovat klienty, kteří se ověřují pomocí certifikátů X.509 v přenosové vrstvě, postupujte podle předchozího postupu, ale s dalším parametrem, jak je znázorněno v následujícím příkladu.

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

Odstranění certifikátu SSL z čísla portu

  1. Pomocí nástroje HttpCfg.exe nebo Netsh.exe zobrazte porty a kryptografické otisky všech vazeb v počítači. Chcete-li vytisknout informace na disk, použijte znak přesměrování ">", jak je znázorněno v následujícím příkladu.

    httpcfg query ssl>myMachinePorts.txt  
    
  2. V systému Windows Server 2003 nebo Windows XP použijte nástroj HttpCfg.exe s klíčovými slovy delete a ssl . Pomocí přepínače -i zadejte IPčíslo :port a přepínač -h k určení kryptografického otisku.

    httpcfg delete ssl -i 0.0.0.0:8005 -h 0000000000003ed9cd0c315bbb6dc1c08da5e6  
    
  3. V systému Windows Vista použijte nástroj Netsh.exe, jak je znázorněno v následujícím příkladu.

    Netsh http delete sslcert ipport=0.0.0.0:8005  
    

Příklad

Následující kód ukazuje, jak vytvořit službu v místním prostředí pomocí WSHttpBinding třídy nastavené na zabezpečení přenosu. Při vytváření aplikace zadejte číslo portu v adrese.

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

Viz také