Sdílet prostřednictvím


Certifikát zabezpečení zprávy

Ukázka MessageSecurity ukazuje, jak implementovat aplikaci, která používá WS-Security s ověřováním certifikátu X.509 v3 pro klienta a vyžaduje ověření serveru pomocí certifikátu X.509 v3 serveru. Tato ukázka používá výchozí nastavení tak, aby všechny zprávy aplikace mezi klientem a serverem byly podepsány a zašifrovány. Tato ukázka je založená na WSHttpBindingu a skládá se z programu konzoly klienta a knihovny služeb hostované službou Internetová informační služba (IIS). Služba implementuje kontrakt, který definuje komunikační vzor žádosti a odpovědi.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Ukázka ukazuje řízení ověřování pomocí konfigurace a způsobu získání identity volajícího z kontextu zabezpečení, jak je znázorněno v následujícím ukázkovém kódu.

public class CalculatorService : ICalculator
{
    public string GetCallerIdentity()
    {
        // The client certificate is not mapped to a Windows identity by default.
        // ServiceSecurityContext.PrimaryIdentity is populated based on the information
        // in the certificate that the client used to authenticate itself to the service.
        return ServiceSecurityContext.Current.PrimaryIdentity.Name;
    }
    ...
}

Služba zveřejňuje jeden koncový bod pro komunikaci se službou a jeden koncový bod pro zveřejnění dokumentu WSDL služby pomocí protokolu WS-MetadataExchange definovaného pomocí konfiguračního souboru (Web.config). Koncový bod se skládá z adresy, vazby a kontraktu. Vazba je nakonfigurovaná pomocí standardního <elementu wsHttpBinding> , který ve výchozím nastavení používá zabezpečení zpráv. Tato ukázka nastaví clientCredentialType atribut na Certifikát tak, aby vyžadoval ověření klienta.

<system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="wsHttpBinding"/>
    </protocolMapping>
    <bindings>
      <wsHttpBinding>
        <!--
        This configuration defines the security mode as Message and
        the clientCredentialType as Certificate.
        -->
        <binding>
          <security mode ="Message">
            <message clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <!--
        The serviceCredentials behavior allows one to define a service certificate.
        A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
        This configuration references the "localhost" certificate installed during the setup instructions.
        -->
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
            <clientCertificate>
              <!--
            Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
            is in the user's Trusted People store, then it will be trusted without performing a
            validation of the certificate's issuer chain. This setting is used here for convenience so that the
            sample can be run without having to have certificates issued by a certification authority (CA).
            This setting is less secure than the default, ChainTrust. The security implications of this
            setting should be carefully considered before using PeerOrChainTrust in production code.
            -->
              <authentication certificateValidationMode="PeerOrChainTrust" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Chování určuje přihlašovací údaje služby, které se použijí při ověření služby klientem. Název subjektu certifikátu serveru je zadán v findValue atributu v elementu <serviceCredentials> .

<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <!--
        The serviceCredentials behavior allows one to define a service certificate.
        A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
        This configuration references the "localhost" certificate installed during the setup instructions.
        -->
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
            <clientCertificate>
              <!--
            Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
            is in the user's Trusted People store, then it will be trusted without performing a
            validation of the certificate's issuer chain. This setting is used here for convenience so that the
            sample can be run without having to have certificates issued by a certification authority (CA).
            This setting is less secure than the default, ChainTrust. The security implications of this
            setting should be carefully considered before using PeerOrChainTrust in production code.
            -->
              <authentication certificateValidationMode="PeerOrChainTrust" />
            </clientCertificate>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>

Konfigurace koncového bodu klienta se skládá z absolutní adresy koncového bodu služby, vazby a kontraktu. Vazba klienta je nakonfigurovaná s odpovídajícím režimem zabezpečení a režimem ověřování. Při spuštění ve scénáři mezi počítači se ujistěte, že se odpovídajícím způsobem změní adresa koncového bodu služby.

<system.serviceModel>
    <client>
      <!-- Use a behavior to configure the client certificate to present to the service. -->
      <endpoint address="http://localhost/servicemodelsamples/service.svc" binding="wsHttpBinding" bindingConfiguration="Binding1" behaviorConfiguration="ClientCertificateBehavior" contract="Microsoft.Samples.Certificate.ICalculator"/>
    </client>

    <bindings>
      <wsHttpBinding>
        <!--
        This configuration defines the security mode as Message and
        the clientCredentialType as Certificate.
        -->
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="Certificate"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
...
</system.serviceModel>

Implementace klienta může certifikát nastavit tak, aby se používal, a to buď prostřednictvím konfiguračního souboru, nebo prostřednictvím kódu. Následující ukázka ukazuje, jak nastavit certifikát pro použití v konfiguračním souboru.

<system.serviceModel>
  ...

<behaviors>
      <endpointBehaviors>
        <behavior name="ClientCertificateBehavior">
          <!--
        The clientCredentials behavior allows one to define a certificate to present to a service.
        A certificate is used by a client to authenticate itself to the service and provide message integrity.
        This configuration references the "client.com" certificate installed during the setup instructions.
        -->
          <clientCredentials>
            <clientCertificate findValue="client.com" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/>
            <serviceCertificate>
              <!--
            Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
            is in the user's Trusted People store, then it will be trusted without performing a
            validation of the certificate's issuer chain. This setting is used here for convenience so that the
            sample can be run without having to have certificates issued by a certificate authority (CA).
            This setting is less secure than the default, ChainTrust. The security implications of this
            setting should be carefully considered before using PeerOrChainTrust in production code.
            -->
              <authentication certificateValidationMode="PeerOrChainTrust"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

</system.serviceModel>

Následující ukázka ukazuje, jak volat službu v programu.

// Create a client.
CalculatorClient client = new CalculatorClient();

// Call the GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.

CN=client.com
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Dávkový soubor Setup.bat, který je součástí ukázek zabezpečení zpráv, umožňuje nakonfigurovat klienta a server s relevantními certifikáty pro spuštění hostované aplikace, která vyžaduje zabezpečení založené na certifikátech. Dávkový soubor lze spustit ve třech režimech. Chcete-li spustit v režimu s jedním počítačem typ setup.bat v příkazovém řádku pro vývojáře pro Visual Studio ; pro typ režimu služby setup.bat služby; a pro typ klientského režimu setup.bat klienta. Při spuštění ukázky na počítačích použijte režim klienta a serveru. Podrobnosti najdete v postupu nastavení na konci tohoto tématu. Níže najdete stručný přehled různých částí dávkových souborů, aby je bylo možné upravit tak, aby běžely v příslušné konfiguraci:

  • Vytvoření klientského certifikátu

    Následující řádek v dávkovém souboru vytvoří klientský certifikát. Zadaný název klienta se používá v názvu subjektu vytvořeného certifikátu. Certifikát je uložený v My úložišti v CurrentUser umístění úložiště.

    echo ************
    echo making client cert
    echo ************
    makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
    
  • Instalace klientského certifikátu do úložiště důvěryhodných certifikátů serveru

    Následující řádek v dávkovém souboru zkopíruje klientský certifikát do důvěryhodného úložiště serveru Lidé aby mohl server učinit relevantní rozhodnutí o důvěryhodnosti nebo bez důvěryhodnosti. Aby certifikát nainstalovaný v důvěryhodném úložišti Lidé důvěřoval službě Windows Communication Foundation (WCF), musí být režim ověření klientského certifikátu nastaven na PeerOrChainTrust hodnotu nebo PeerTrust. Informace o tom, jak to lze provést pomocí konfiguračního souboru, najdete v předchozí ukázce konfigurace služby.

    echo ************
    echo copying client cert to server's LocalMachine store
    echo ************
    certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeople
    
  • Vytvoření certifikátu serveru

    Následující řádky z dávkového souboru Setup.bat vytvoří certifikát serveru, který se má použít.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    

    Proměnná %SERVER_NAME% určuje název serveru. Certifikát je uložen v úložišti LocalMachine. Pokud je dávkový soubor Setup.bat spuštěn s argumentem služby (například služba setup.bat), obsahuje %SERVER_NAME% plně kvalifikovaný název domény počítače. Jinak se výchozí hodnota nastaví na localhost.

  • Instalace certifikátu serveru do důvěryhodného úložiště certifikátů klienta

    Následující řádek zkopíruje certifikát serveru do úložiště důvěryhodných osob klienta. Tento krok je povinný, protože certifikáty generované Makecert.exe nejsou implicitně důvěryhodné klientským systémem. Pokud už máte certifikát, který je kořenový v kořenovém certifikátu klienta ( například certifikát vydaný Microsoftem), tento krok naplnění úložiště klientských certifikátů certifikátem pomocí certifikátu serveru se nevyžaduje.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Udělení oprávnění k privátnímu klíči certifikátu

    Následující řádky v souboru Setup.bat vytvoří certifikát serveru uložený v úložišti LocalMachine přístupný pro účet pracovního procesu ASP.NET.

    echo ************
    echo setting privileges on server certificates
    echo ************
    for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i
    set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE
    (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET
    echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R
    iisreset
    

    Poznámka:

    Pokud používáte jiné uživatele než USA. Anglickou edici systému Windows, musíte upravit Setup.bat soubor a nahradit název účtu NT AUTHORITY\NETWORK SERVICE názvem vašeho regionálního ekvivalentu.

Poznámka:

Nástroje použité v tomto dávkovém souboru jsou umístěné v souboru C:\Program Files\Microsoft Visual Studio 8\Common7\tools nebo C:\Program Files\Microsoft SDKs\Windows\v6.0\bin. Jeden z těchto adresářů musí být ve vaší systémové cestě. Pokud máte nainstalovanou sadu Visual Studio, nejjednodušší způsob, jak získat tento adresář v cestě, je otevřít příkazový řádek pro vývojáře pro Visual Studio. Klepněte na tlačítko Start a pak vyberte Všechny programy, Visual Studio 2012, Nástroje. Tento příkazový řádek má již nakonfigurované odpovídající cesty. Jinak musíte do cesty přidat příslušný adresář ručně.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

Spuštění ukázky na stejném počítači

  1. Otevřete příkazový řádek pro vývojáře pro Visual Studio s oprávněními správce a spusťte Setup.bat z ukázkové instalační složky. Tím se nainstalují všechny certifikáty potřebné pro spuštění ukázky.

    Poznámka:

    Dávkový soubor Setup.bat je navržený tak, aby běžel z příkazového řádku pro vývojáře pro Visual Studio. Vyžaduje, aby proměnná prostředí cesty ukazovala na adresář, ve kterém je sada SDK nainstalovaná. Tato proměnná prostředí se automaticky nastaví v rámci příkazového řádku pro vývojáře pro Visual Studio (2010).

  2. Zadáním adresy http://localhost/servicemodelsamples/service.svcověřte přístup ke službě pomocí prohlížeče.

  3. Spusťte Client.exe z \client\bin. Aktivita klienta se zobrazí v aplikaci konzoly klienta.

  4. Pokud klient a služba nemůžou komunikovat, přečtěte si téma Řešení potíží Tipy pro ukázky WCF.

Spuštění ukázky napříč počítači

  1. Vytvořte adresář na počítači služby. Pomocí nástroje pro správu Internetová informační služba (IIS) vytvořte virtuální aplikaci s názvem servicemodelsamples pro tento adresář.

  2. Zkopírujte soubory programu služby z \inetpub\wwwroot\servicemodelsamples do virtuálního adresáře v počítači služby. Ujistěte se, že kopírujete soubory v podadresáři \bin. Zkopírujte také soubory Setup.bat, Cleanup.bat a ImportClientCert.bat do počítače služby.

  3. Vytvořte adresář v klientském počítači pro binární soubory klienta.

  4. Zkopírujte soubory klientského programu do klientského adresáře v klientském počítači. Zkopírujte také soubory Setup.bat, Cleanup.bat a ImportServiceCert.bat do klienta.

  5. Na serveru spusťte službu setup.bat v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Spuštění setup.bat s argumentem služby vytvoří certifikát služby s plně kvalifikovaným názvem domény počítače a exportuje certifikát služby do souboru s názvem Service.cer.

  6. Upravte web.config tak, aby odrážel nový název certifikátu (v findValue atributu <serviceCertificate>), který je stejný jako plně kvalifikovaný název domény počítače.

  7. Zkopírujte soubor Service.cer z adresáře služby do klientského adresáře v klientském počítači.

  8. Na klientovi spusťte klienta setup.bat v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Spuštění setup.bat s argumentem klienta vytvoří klientský certifikát s názvem client.com a exportuje klientský certifikát do souboru s názvem Client.cer.

  9. V souboru Client.exe.config na klientském počítači změňte hodnotu adresy koncového bodu tak, aby odpovídala nové adrese vaší služby. Provedete to tak, že nahradíte localhost plně kvalifikovaným názvem domény serveru.

  10. Zkopírujte soubor Client.cer z klientského adresáře do adresáře služby na serveru.

  11. Na klientovi spusťte ImportServiceCert.bat v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Tím se certifikát služby naimportuje ze souboru Service.cer do úložiště CurrentUser – Trusted Lidé.

  12. Na serveru spusťte ImportClientCert.bat v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Tím se klientský certifikát naimportuje ze souboru Client.cer do úložiště LocalMachine – Trusted Lidé.

  13. Na klientském počítači spusťte Client.exe z okna příkazového řádku. Pokud klient a služba nemůžou komunikovat, přečtěte si téma Řešení potíží Tipy pro ukázky WCF.

Vyčištění po ukázce

  • Po dokončení spuštění ukázky spusťte Cleanup.bat ve složce s ukázkami.

    Poznámka:

    Tento skript při spuštění této ukázky na počítačích neodebere certifikáty služby v klientovi. Pokud jste spustili ukázky wcf (Windows Communication Foundation), které používají certifikáty napříč počítači, nezapomeňte vymazat certifikáty služby nainstalované v úložišti CurrentUser – Trusted Lidé. K tomu použijte následující příkaz: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Například: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.