Aracılığıyla paylaş


İleti Kuyruğa Alma ile İleti Güvenliği

MessageSecurity örneği, istemci için X.509v3 sertifika kimlik doğrulaması ile WS-Security kullanan ve MSMQ üzerinden sunucunun X.509v3 sertifikasını kullanarak sunucu kimlik doğrulaması gerektiren bir uygulamanın nasıl uygulandığını gösterir. MSMQ deposundaki iletilerin şifrelenmiş kalmasını ve uygulamanın iletinin kendi kimlik doğrulamasını gerçekleştirebilmesini sağlamak için ileti güvenliği bazen daha fazla tercih edilir.

Bu örnek, İşlem Yapılan MSMQ Bağlama örneğini temel alır. İletiler şifrelenir ve imzalar.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Hizmet önce çalıştırılırsa kuyruğun mevcut olduğundan emin olmak için denetler. Kuyruk yoksa, hizmet bir kuyruk oluşturur. Kuyruğu oluşturmak için önce hizmeti çalıştırabilir veya MSMQ Kuyruk Yöneticisi aracılığıyla bir kuyruk oluşturabilirsiniz. Windows 2008'de kuyruk oluşturmak için bu adımları izleyin.

    1. Visual Studio 2012'de Sunucu Yöneticisi açın.

    2. Özellikler sekmesini genişletin.

    3. Özel İleti Kuyrukları'ne sağ tıklayın ve Yeni, Özel Kuyruk'a tıklayın.

    4. İşlem kutusunu işaretleyin.

    5. Yeni kuyruğun adı olarak girin ServiceModelSamplesTransacted .

  3. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

Örneği aynı bilgisayarda çalıştırmak için

  1. Yolun Makecert.exe ve FindPrivateKey.exe içeren klasörü içerdiğinden emin olun.

  2. Örnek yükleme klasöründen Setup.bat çalıştırın. Bu, örneği çalıştırmak için gereken tüm sertifikaları yükler.

    Not

    Örnekle işiniz bittiğinde Cleanup.bat çalıştırarak sertifikaları kaldırdığınızdan emin olun. Diğer güvenlik örnekleri aynı sertifikaları kullanır.

  3. \service\bin konumundan Service.exe başlatın.

  4. \client\bin konumundan Client.exe başlatın. İstemci etkinliği, istemci konsol uygulamasında görüntülenir.

  5. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için sorun giderme İpuçları.

Örneği bilgisayarlar arasında çalıştırmak için

  1. Setup.bat, Cleanup.bat ve ImportClientCert.bat dosyalarını hizmet bilgisayarına kopyalayın.

  2. İstemci ikili dosyaları için istemci bilgisayarda bir dizin oluşturun.

  3. İstemci programı dosyalarını istemci bilgisayardaki istemci dizinine kopyalayın. Ayrıca Setup.bat, Cleanup.bat ve ImportServiceCert.bat dosyalarını istemciye kopyalayın.

  4. sunucusunda komutunu çalıştırın setup.bat service. bağımsız değişkeniyle service çalıştırmaksetup.bat, bilgisayarın tam etki alanı adına sahip bir hizmet sertifikası oluşturur ve hizmet sertifikasını Service.cer adlı bir dosyaya aktarır.

  5. Hizmetin service.exe.config dosyasını, bilgisayarın tam etki alanı adıyla aynı olan yeni sertifika adını (findValueserviceCertificate> özniteliğinde<) yansıtacak şekilde düzenleyin.

  6. Service.cer dosyasını hizmet dizininden istemci bilgisayardaki istemci dizinine kopyalayın.

  7. İstemcide komutunu çalıştırın setup.bat client. bağımsız değişkeniyle client çalıştırmak setup.bat client.com adlı bir istemci sertifikası oluşturur ve istemci sertifikasını Client.cer adlı bir dosyaya aktarır.

  8. İstemci bilgisayardaki Client.exe.config dosyasında, uç noktanın adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin. Bunu yapmak için localhost yerine sunucunun tam etki alanı adını yazın. Ayrıca hizmetin sertifika adını, hizmet bilgisayarının tam etki alanı adıyla aynı olacak şekilde değiştirmeniz gerekir (findValuealtındaki clientCredentialsöğesindeki defaultCertificateserviceCertificate özniteliğinde).

  9. Client.cer dosyasını istemci dizininden sunucudaki hizmet dizinine kopyalayın.

  10. İstemcide komutunu çalıştırın ImportServiceCert.bat. Bu, hizmet sertifikasını Service.cer dosyasından CurrentUser - Trusted Kişiler deposuna aktarır.

  11. sunucusunda komutunu çalıştırınImportClientCert.bat, bu, istemci sertifikasını Client.cer dosyasından LocalMachine - Trusted Kişiler deposuna aktarır.

  12. Hizmet bilgisayarında, komut isteminden Service.exe başlatın.

  13. İstemci bilgisayarda, komut isteminden Client.exe başlatın. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için sorun giderme İpuçları.

Örnekten sonra temizlemek için

  • Örneği çalıştırmayı bitirdikten sonra örnekler klasöründe Cleanup.bat çalıştırın.

    Not

    Bu betik, bu örneği bilgisayarlar arasında çalıştırırken istemcideki hizmet sertifikalarını kaldırmaz. Bilgisayarlar arasında sertifika kullanan Windows Communication Foundation (WCF) örnekleri çalıştırdıysanız CurrentUser - Trusted Kişiler deposuna yüklenmiş hizmet sertifikalarını temizlediğinizden emin olun. Bunu yapmak için şu komutu kullanın: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Örneğin: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Gereksinimler

Bu örnek MSMQ'nin yüklü ve çalışır durumda olmasını gerektirir.

Gösteriler

İstemci, hizmetin ortak anahtarını kullanarak iletiyi şifreler ve iletiyi kendi sertifikasını kullanarak imzalar. Kuyruktan iletiyi okuyan hizmet, istemci sertifikasının kimliğini güvenilen kişiler deposundaki sertifikayla doğrular. Ardından iletinin şifresini çözer ve iletiyi hizmet işlemine iletir.

Windows Communication Foundation (WCF) iletisi MSMQ iletisinin gövdesinde yük olarak taşındığından, gövde MSMQ deposunda şifrelenmiş olarak kalır. Bu, iletinin istenmeyen bir şekilde açığa çıkmasını engeller. MSMQ'un taşıdığı iletinin şifrelenip şifrelenmediğinin farkında olmadığını unutmayın.

Örnek, ileti düzeyinde karşılıklı kimlik doğrulamasının MSMQ ile nasıl kullanılabileceğini gösterir. Sertifikalar bant dışı olarak değiştirilir. Hizmet ve istemcinin aynı anda çalışır durumda olması gerekmediğinden, kuyruğa alınan uygulama her zaman böyledir.

Açıklama

Örnek istemci ve hizmet kodu, tek bir farkla İşlem Yapılan MSMQ Bağlama örneğiyle aynıdır. İşlem sözleşmesine, iletinin imzalanması ve şifrelenmesini öneren koruma düzeyiyle ek açıklama eklenir.

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

App.config, hizmeti ve istemciyi tanımlamak için gerekli belirteci kullanarak iletinin güvenliğinin sağlandığından emin olmak için kimlik bilgileri içerir.

İstemci yapılandırması, hizmetin kimliğini doğrulamak için hizmet sertifikasını belirtir. Hizmetin geçerliliğine güvenmek için LocalMachine deposunu güvenilen depo olarak kullanır. Ayrıca, istemcinin hizmet kimlik doğrulaması için iletisiyle birlikte eklenen istemci sertifikasını belirtir.

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

Güvenlik modunun İleti ve ClientCredentialType'ın Sertifika olarak ayarlandığını unutmayın.

Hizmet yapılandırması, istemci hizmetin kimliğini doğruladığında kullanılan hizmetin kimlik bilgilerini belirten bir hizmet davranışı içerir. Sunucu sertifikası konu adı serviceCredentials> özniteliğinde <belirtilirfindValue.

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

Örnek, aşağıdaki örnek kodda gösterildiği gibi yapılandırma kullanarak kimlik doğrulamasını denetlemeyi ve arayan kimliğini güvenlik bağlamından nasıl edinileceğini gösterir:

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

Çalıştırıldığında, hizmet kodu istemci kimliğini görüntüler. Aşağıda hizmet kodundan alınan örnek bir çıkış verilmiştir:

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

Açıklamalar

  • İstemci sertifikası oluşturuluyor.

    Toplu iş dosyasındaki aşağıdaki satır istemci sertifikasını oluşturur. Belirtilen istemci adı, oluşturulan sertifikanın konu adında kullanılır. Sertifika, depo konumunda CurrentUser depolanırMy.

    echo ************
    echo making client cert
    echo ************
    makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
    
  • İstemci sertifikasını sunucunun güvenilen sertifika deposuna yükleme.

    Toplu iş dosyasındaki aşağıdaki satır, sunucunun ilgili güven veya güvensiz kararları alabilmesi için istemci sertifikasını sunucunun Güvenilen Kişiler deposuna kopyalar. Güvenilen Kişiler deposunda yüklü bir sertifikanın bir Windows Communication Foundation (WCF) hizmeti tarafından güvenilir olması için istemci sertifikası doğrulama modunun veya PeerTrust değerine ayarlanması PeerOrChainTrust gerekir. Bunun bir yapılandırma dosyası kullanılarak nasıl yapılabilmesini öğrenmek için önceki hizmet yapılandırma örneğine bakın.

    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
    
  • Sunucu sertifikası oluşturuluyor.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar kullanılacak sunucu sertifikasını oluşturur:

    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
    

    %SERVER_NAME% değişkeni sunucu adını belirtir. Sertifika LocalMachine deposunda depolanır. Kurulum toplu iş dosyası bir hizmet bağımsız değişkeniyle (örneğin, setup.bat service) çalıştırılırsa %SERVER_NAME% bilgisayarın tam etki alanı adını içerir. Aksi takdirde varsayılan olarak localhost olur

  • Sunucu sertifikasını istemcinin güvenilen sertifika deposuna yükleme.

    Aşağıdaki satır, sunucu sertifikasını istemcinin güvenilen kişiler deposuna kopyalar. Makecert.exe tarafından oluşturulan sertifikalara istemci sistemi tarafından örtük olarak güvenilmediğinden bu adım gereklidir. İstemci güvenilen kök sertifikasında (örneğin, Microsoft tarafından verilen bir sertifika) köke sahip bir sertifikanız zaten varsa, istemci sertifika depoyu sunucu sertifikasıyla doldurma adımı gerekli değildir.

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

    Not

    ABD dışı bir kullanıcı kullanıyorsanız Microsoft Windows'un İngilizce sürümü, Setup.bat dosyasını düzenlemeniz ve "NT AUTHORITY\NETWORK SERVICE" hesap adını bölgesel eşdeğerinizle değiştirmeniz gerekir.