Sdílet prostřednictvím


Zabezpečení zprávy pomocí služby Řízení front zpráv

Ukázka MessageSecurity ukazuje, jak implementovat aplikaci, která používá WS-Security s ověřováním certifikátů X.509v3 pro klienta a vyžaduje ověření serveru pomocí certifikátu X.509v3 serveru přes MSMQ. Zabezpečení zpráv je někdy žádoucí zajistit, aby zprávy v úložišti MSMQ zůstaly zašifrované a aplikace může provádět vlastní ověřování zprávy.

Tato ukázka je založená na ukázce transacted MSMQ Binding . Zprávy jsou šifrované a podepsané.

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 je služba spuštěná jako první, zkontroluje, jestli je fronta k dispozici. Pokud fronta není k dispozici, služba ji vytvoří. Službu můžete nejprve spustit, abyste vytvořili frontu, nebo ji můžete vytvořit prostřednictvím Správce front MSMQ. Podle těchto kroků vytvořte frontu v systému Windows 2008.

    1. Otevřete Správce serveru v sadě Visual Studio 2012.

    2. Rozbalte kartu Funkce.

    3. Klikněte pravým tlačítkem myši na Soukromé fronty zpráv a vyberte Nová soukromá fronta.

    4. Zaškrtněte políčko Transactional (Transakce).

    5. Zadejte ServiceModelSamplesTransacted jako název nové fronty.

  3. 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. Ujistěte se, že cesta obsahuje složku, která obsahuje Makecert.exe a FindPrivateKey.exe.

  2. 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:

    Ujistěte se, že po dokončení ukázky odeberete certifikáty spuštěním Cleanup.bat. Jiné ukázky zabezpečení používají stejné certifikáty.

  3. Spusťte Service.exe ze souboru \service\bin.

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

  5. 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. Zkopírujte soubory Setup.bat, Cleanup.bat a ImportClientCert.bat do počítače služby.

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

  3. 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.

  4. Na serveru spusťte setup.bat servicepříkaz . Spuštění setup.bat s argumentem service 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.

  5. Upravte service.exe.config služby 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.

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

  7. Na klientovi spusťte setup.bat clientpříkaz . Spuštění setup.bat s argumentem client vytvoří klientský certifikát s názvem client.com a exportuje klientský certifikát do souboru s názvem Client.cer.

  8. 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. Musíte také změnit název certifikátu služby tak, aby byl stejný jako plně kvalifikovaný název domény počítače služby (v findValue atributu defaultCertificate v prvku serviceCertificate pod clientCredentials).

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

  10. Na klientovi spusťte ImportServiceCert.batpříkaz . Tím se certifikát služby naimportuje ze souboru Service.cer do úložiště CurrentUser – Trusted Lidé.

  11. Na serveru spusťte ImportClientCert.batpříkaz , Tento importuje klientský certifikát ze souboru Client.cer do úložiště LocalMachine - Trusted Lidé.

  12. Na počítači služby spusťte Service.exe z příkazového řádku.

  13. Na klientském počítači spusťte Client.exe z 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.

Požadavky

Tato ukázka vyžaduje, aby byla služba MSMQ nainstalovaná a spuštěná.

Demonstruje

Klient zašifruje zprávu pomocí veřejného klíče služby a podepíše zprávu pomocí vlastního certifikátu. Služba, která čte zprávu z fronty, ověřuje klientský certifikát certifikátem v úložišti důvěryhodných osob. Potom zprávu dešifruje a odešle zprávu do operace služby.

Protože zpráva WCF (Windows Communication Foundation) se přenáší jako datová část v těle zprávy MSMQ, tělo zůstane zašifrované v úložišti MSMQ. Tím se zabezpečí zpráva před nežádoucím zveřejněním zprávy. Všimněte si, že samotný MSMQ neví, zda je zpráva, kterou je přenášena, zašifrována.

Ukázka ukazuje, jak lze s MSMQ použít vzájemné ověřování na úrovni zprávy. Certifikáty se vyměňují mimo pásmo. To je vždy případ s aplikací zařazenou do fronty, protože služba a klient nemusí být ve stejnou dobu v provozu.

Popis

Ukázkový kód klienta a služby jsou stejné jako ukázka transacted MSMQ Binding s jedním rozdílem. Kontrakt operace je opatřen poznámkami na úrovni ochrany, což naznačuje, že zpráva musí být podepsána a zašifrována.

// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, ProtectionLevel=ProtectionLevel.EncryptAndSign)]
    void SubmitPurchaseOrder(PurchaseOrder po);
}

Aby se zajistilo, že je zpráva zabezpečená pomocí požadovaného tokenu k identifikaci služby a klienta, obsahuje App.config informace o přihlašovacích údaji.

Konfigurace klienta určuje certifikát služby pro ověření služby. Využívá své úložiště LocalMachine jako důvěryhodné úložiště k závislosti na platnosti služby. Určuje také klientský certifikát, který je připojen se zprávou pro ověřování služby klienta.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.serviceModel>

    <client>
      <!-- Define NetMsmqEndpoint -->
      <endpoint address="net.msmq://localhost/private/ServiceModelSamplesMessageSecurity"
                binding="netMsmqBinding"
                bindingConfiguration="messageSecurityBinding"
                contract="Microsoft.ServiceModel.Samples.IOrderProcessor"
                behaviorConfiguration="ClientCertificateBehavior" />
    </client>

    <bindings>
        <netMsmqBinding>
            <binding name="messageSecurityBinding">
                <security mode="Message">
                    <message clientCredentialType="Certificate"/>
                </security>
            </binding>
        </netMsmqBinding>
    </bindings>

    <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>
                <defaultCertificate findValue="localhost" storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
              <!--
            Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
            is in the user's Trusted People store, then it is 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" />
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

Všimněte si, že režim zabezpečení je nastaven na message a ClientCredentialType je nastaven na Certifikát.

Konfigurace služby zahrnuje chování služby, které 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 serviceCredentials>.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <!-- Use appSetting to configure MSMQ queue name. -->
    <add key="queueName" value=".\private$\ServiceModelSamplesMessageSecurity" />
  </appSettings>

  <system.serviceModel>
    <services>
      <service
          name="Microsoft.ServiceModel.Samples.OrderProcessorService"
          behaviorConfiguration="PurchaseOrderServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
          </baseAddresses>
        </host>
        <!-- Define NetMsmqEndpoint -->
        <endpoint address="net.msmq://localhost/private/ServiceModelSamplesMessageSecurity"
                  binding="netMsmqBinding"
                  bindingConfiguration="messageSecurityBinding"
                  contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
        <!-- The mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex. -->
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
        <netMsmqBinding>
            <binding name="messageSecurityBinding">
                <security mode="Message">
                    <message clientCredentialType="Certificate" />
                </security>
            </binding>
        </netMsmqBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="PurchaseOrderServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <!--
               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>
                <certificate findValue="client.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
              <!--
            Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
            is in the user's Trusted People store, then it is 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>

</configuration>

Ukázka ukazuje řízení ověřování pomocí konfigurace a 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:

// Service class which implements the service contract.
// Added code to write output to the console window.
public class OrderProcessorService : IOrderProcessor
{
    private 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;
    }

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void SubmitPurchaseOrder(PurchaseOrder po)
    {
        Console.WriteLine("Client's Identity {0} ", GetCallerIdentity());
        Orders.Add(po);
        Console.WriteLine("Processing {0} ", po);
    }
  //…
}

Při spuštění zobrazí kód služby identifikaci klienta. Následuje ukázkový výstup z kódu služby:

The service is ready.
Press <ENTER> to terminate service.

Client's Identity CN=client.com; ECA6629A3C695D01832D77EEE836E04891DE9D3C
Processing Purchase Order: 6536e097-da96-4773-9da3-77bab4345b5d
        Customer: somecustomer.com
        OrderDetails
                Order LineItem: 54 of Blue Widget @unit price: $29.99
                Order LineItem: 890 of Red Widget @unit price: $45.89
        Total cost of this order: $42461.56
        Order status: Pending

Komentáře

  • 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 důvěryhodného úložiště 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. Pro certifikát nainstalovaný v důvěryhodném úložišti Lidé, kterému služba WCF (Windows Communication Foundation) důvěřuje, musí být režim ověření klientského certifikátu nastaven na PeerOrChainTrust hodnotu nebo PeerTrust hodnotu. 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 instalačního programu spuštěn s argumentem služby (například setup.bat service) 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
    

    Poznámka:

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