Megosztás:


Üzenetbiztonság a Message Queuing szolgáltatáson keresztül

A MessageSecurity-minta bemutatja, hogyan lehet egy alkalmazást implementálni, amely az ügyfél X.509v3 tanúsítványalapú hitelesítését használja a WS-Security számára, és igényli a kiszolgáló X.509v3 tanúsítványalapú hitelesítését az MSMQ-n keresztül. Az üzenetbiztonság néha kívánatosabb annak biztosítása érdekében, hogy az MSMQ-tárolóban lévő üzenetek titkosítva maradjanak, és az alkalmazás elvégezhesse az üzenet saját hitelesítését.

Ez a minta a Transacted MSMQ Binding mintán alapul. Az üzenetek titkosítva és aláírva vannak.

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.

  2. Ha a szolgáltatást először futtatják, ellenőrzi, hogy az üzenetsor jelen van-e. Ha az üzenetsor nincs jelen, a szolgáltatás létrehoz egyet. Először futtathatja a szolgáltatást az üzenetsor létrehozásához, vagy létrehozhat egyet az MSMQ Queue Manageren keresztül. Az alábbi lépéseket követve hozzon létre egy sort a Windows Server 2008-ban.

    1. Nyissa meg a Kiszolgálókezelőt a Visual Studio 2012-ben.

    2. Nyissa meg a Funkciók lapot.

    3. Kattintson a jobb gombbal a Privát üzenetsorokelemre, és válassza Új, Privát üzenetsorlehetőséget.

    4. Jelölje be a Tranzakciós jelölőnégyzetet.

    5. Adja meg ServiceModelSamplesTransacted az új üzenetsor neveként.

  3. A megoldás C# vagy Visual Basic kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.

A minta futtatása ugyanazon a számítógépen

  1. Győződjön meg arról, hogy az elérési út tartalmazza a Makecert.exe és FindPrivateKey.exetartalmazó mappát.

  2. A Setup.bat futtatása a minta telepítési mappából. Ez telepíti a minta futtatásához szükséges összes tanúsítványt.

    Jegyzet

    Győződjön meg arról, hogy a mintával való munka befejezése után a Cleanup.bat futtatásával eltávolítja a tanúsítványokat. Más biztonsági minták ugyanazokat a tanúsítványokat használják.

  3. Indítsa el a Service.exe a \service\bin fájlból.

  4. Indítsa el a Client.exe a \client\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.

  5. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg WCF-minták hibaelhárítási tippjeinek.

A minta futtatása számítógépeken

  1. Másolja a Setup.bat, Cleanup.batés ImportClientCert.bat fájlokat a szolgáltatásszámítógépre.

  2. Hozzon létre egy könyvtárat az ügyfélszámítógépen az ügyfél bináris fájljaihoz.

  3. Másolja az ügyfélprogram fájljait az ügyfélszámítógép ügyfélkönyvtárába. Másolja a Setup.bat, Cleanup.batés ImportServiceCert.bat fájlokat is az ügyfélbe.

  4. Futtassa a setup.bat servicea kiszolgálón. A setup.bat argumentummal futtatott service létrehoz egy szolgáltatástanúsítványt a számítógép teljes tartománynevével, és exportálja a szolgáltatástanúsítványt egy Service.cer nevű fájlba.

  5. Szerkessze a szolgáltatás service.exe.config, hogy tükrözze az új tanúsítványnevet (a findValue< attribútumában), amely megegyezik a számítógép teljes tartománynevével.

  6. Másolja a Service.cer fájlt a szolgáltatáskönyvtárból az ügyfélszámítógép ügyfélkönyvtárába.

  7. Kliens oldalon futtassa a setup.bat client. A setup.bat argumentummal futtatott client létrehoz egy client.com nevű ügyféltanúsítványt, és exportálja az ügyféltanúsítványt egy Client.cer nevű fájlba.

  8. Az ügyfélszámítógép Client.exe.config fájljában módosítsa a végpont címértékét úgy, hogy az megfeleljen a szolgáltatás új címének. Ehhez cserélje le a localhost nevét a kiszolgáló teljes domain nevére. A szolgáltatás tanúsítványnevét úgy is módosítania kell, hogy megegyezzon a szolgáltatásszámítógép teljes tartománynevével (a findValuealatti defaultCertificateserviceCertificate eleme clientCredentials attribútumában).

  9. Másolja a Client.cer fájlt az ügyfélkönyvtárból a kiszolgáló szolgáltatáskönyvtárába.

  10. Kliens oldalon futtassa a ImportServiceCert.bat. Ez importálja a szolgáltatástanúsítványt a Service.cer fájlból a CurrentUser – TrustedPeople tárolóba.

  11. A kiszolgálón futtassa a ImportClientCert.bat, Ez importálja az ügyféltanúsítványt a Client.cer fájlból a LocalMachine – TrustedPeople tárolóba.

  12. A szolgáltatási számítógépen indítsa el a Service.exe-t a parancssorból.

  13. Az ügyfélszámítógépen indítsa el Client.exe a parancssorból. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg WCF-minták hibaelhárítási tippjeinek.

A minta utáni tisztítás

  • A minta végrehajtása után futtassa le a mintamappában lévő Cleanup.bat-t.

    Jegyzet

    Ez a szkript nem távolítja el az ügyfél szolgáltatástanúsítványait, amikor a mintát számítógépeken futtatja. Ha windowsos kommunikációs alap (WCF) mintákat futtat, amelyek tanúsítványokat használnak a számítógépeken, mindenképpen törölje a CurrentUser – TrustedPeople áruházban telepített szolgáltatástanúsítványokat. Ehhez használja a következő parancsot: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Például: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Követelmények

Ehhez a mintához telepíteni és futtatni kell az MSMQ-t.

Megmutatja

Az ügyfél a szolgáltatás nyilvános kulcsával titkosítja az üzenetet, és saját tanúsítványával aláírja az üzenetet. Az üzenetsorból olvasó szolgáltatás hitelesíti az ügyféltanúsítványt a megbízható személyek tárolójában található tanúsítvánnyal. Ezután visszafejti az üzenetet, és elküldi az üzenetet a szolgáltatásműveletnek.

Mivel a Windows Communication Foundation (WCF) üzenet hasznos adatként van tárolva az MSMQ-üzenet törzsében, a törzs titkosítva marad az MSMQ-tárolóban. Ez védi az üzenetet az üzenet nemkívánatos közzétételétől. Vegye figyelembe, hogy maga az MSMQ nem tudja, hogy a hordozott üzenet titkosítva van-e.

A minta bemutatja, hogyan használható az üzenetszintű kölcsönös hitelesítés az MSMQ-val. A tanúsítványok sávon kívül vannak cserélve. Ez mindig így van az üzenetsoros alkalmazás esetében, mert a szolgáltatásnak és az ügyfélnek nem kell egyszerre futnia.

Leírás

A minta ügyfél- és szolgáltatáskódja megegyezik a Transacted MSMQ Kötés mintával egyetlen különbséggel. A műveleti szerződés védelmi szinttel van ellátva, ami arra utal, hogy az üzenetet alá kell írni és titkosítani kell.

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

Annak érdekében, hogy az üzenet a szolgáltatás és az ügyfél azonosításához szükséges jogkivonattal legyen biztonságban, a App.config hitelesítő adatokat tartalmaz.

Az ügyfélkonfiguráció megadja a szolgáltatástanúsítványt a szolgáltatás hitelesítéséhez. A LocalMachine-tárolót használja megbízható tárolóként, hogy a szolgáltatás érvényességére támaszkodjon. Emellett megadja az ügyfél szolgáltatáshitelesítési üzenetéhez csatolt ügyféltanúsítványt is.

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

Vegye figyelembe, hogy a biztonsági mód üzenetre van állítva, a ClientCredentialType pedig Tanúsítvány értékre van állítva.

A szolgáltatáskonfiguráció olyan szolgáltatás-viselkedést tartalmaz, amely megadja a szolgáltatás hitelesítő adatait, amelyeket az ügyfél a szolgáltatás hitelesítésekor használ. A kiszolgálótanúsítvány tulajdonosának neve a findValue< attribútumában van megadva.

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

A minta bemutatja, hogyan szabályozható a hitelesítés konfigurációval, és hogyan szerezheti be a hívó identitását a biztonsági környezetből, ahogyan az a következő mintakódban látható:

// 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);
    }
  //…
}

Futtatáskor a szolgáltatáskód megjeleníti az ügyfélazonosítást. A szolgáltatáskód mintakimenete a következő:

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

Megjegyzések

  • Az ügyféltanúsítvány létrehozása.

    A kötegfájl következő sora hozza létre az ügyféltanúsítványt. A megadott ügyfélnevet használják a létrehozott tanúsítvány tárgy mezőjében szereplő névként. A tanúsítvány a My áruházban, a CurrentUser áruház helyén található.

    echo ************
    echo making client cert
    echo ************
    makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
    
  • Az ügyféltanúsítvány telepítése a kiszolgáló megbízható tanúsítványtárolójába.

    A kötegfájl következő sora átmásolja az ügyféltanúsítványt a kiszolgáló TrustedPeople tárolójába, hogy a kiszolgáló meghozhassa a megfelelő megbízhatósági vagy nem megbízhatósági döntéseket. Ahhoz, hogy egy Windows Communication Foundation (WCF) szolgáltatás megbízhatónak minősítse a TrustedPeople áruházban telepített tanúsítványokat, az ügyféltanúsítvány-érvényesítési módot PeerOrChainTrust vagy PeerTrust értékre kell állítani. Tekintse meg az előző szolgáltatáskonfigurációs mintát, amelyből megtudhatja, hogyan végezhető el ez egy konfigurációs fájl használatával.

    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
    
  • A kiszolgálótanúsítvány létrehozása.

    A Setup.bat kötegfájl alábbi sorai hozzák létre a használni kívánt kiszolgálótanúsítványt:

    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
    

    A %SERVER_NAME% változó megadja a kiszolgáló nevét. A tanúsítvány tárolása a LocalMachine áruházban történik. Ha a beállítási kötegfájl egy szolgáltatás argumentummal (például setup.bat service) fut, a %SERVER_NAME% tartalmazza a számítógép teljes tartománynevét. Ellenkező esetben alapértelmezés szerint a localhost lesz.

  • Kiszolgálótanúsítvány telepítése az ügyfél megbízható tanúsítványtárolójába.

    Az alábbi sor a kiszolgálótanúsítványt az ügyfél megbízható személyek tárolójába másolja. Erre a lépésre azért van szükség, mert a Makecert.exe által létrehozott tanúsítványokat az ügyfélrendszer nem implicit módon megbízhatónak minősíti. Ha már rendelkezik olyan tanúsítvánnyal, amely egy ügyfél megbízható főtanúsítványában gyökerezik – például egy Microsoft által kiadott tanúsítványban –, nem szükséges az ügyféltanúsítvány-tároló kiszolgálótanúsítvánnyal való feltöltésének ez a lépése.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

    Jegyzet

    Ha a Microsoft Windows nem amerikai angol kiadását használja, akkor szerkesztenie kell a Setup.bat fájlt, és le kell cserélnie az "NT AUTHORITY\NETWORK SERVICE" fióknevet a területének megfelelő névre.