Bagikan melalui


Keamanan Pesan melalui Antrean Pesan

Sampel MessageSecurity menunjukkan cara menerapkan aplikasi yang menggunakan WS-Security dengan autentikasi sertifikat X.509 509v3 untuk klien dan memerlukan autentikasi server menggunakan sertifikat X.509 509v3 server melalui MSMQ. Keamanan pesan terkadang lebih diinginkan untuk memastikan bahwa pesan di penyimpanan MSMQ tetap dienkripsi dan aplikasi dapat melakukan autentikasi pesannya sendiri.

Sampel ini didasarkan pada sampel Pengikatan MSMQ yang Ditransaksikan. Pesan dienkripsi dan ditandatangani.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Jika layanan dijalankan terlebih dahulu, layanan akan memeriksa untuk memastikan bahwa antrean ada. Jika antrean tidak ada, layanan akan membuatnya. Anda dapat menjalankan layanan terlebih dahulu untuk membuat antrean, atau Anda dapat membuatnya melalui Pengelola Antrean MSMQ. Ikuti langkah-langkah ini untuk membuat antrean di Windows 2008.

    1. Buka Pengelola Server di Visual Studio 2012.

    2. Luaskan tab Fitur.

    3. Klik kanan Antrean Pesan Privat, dan pilih Baru, Antrean Privat.

    4. Centang kotak Transaksional.

    5. Masukkan ServiceModelSamplesTransacted sebagai nama antrean baru.

  3. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

Untuk menjalankan sampel di komputer yang sama

  1. Pastikan bahwa jalur menyertakan folder tempat Makecert.exe dan FindPrivateKey.exe berada.

  2. Jalankan Setup.bat dari folder pemasangan sampel. Ini memasang semua sertifikat yang diperlukan untuk menjalankan sampel.

    Catatan

    Pastikan Anda menghapus sertifikat dengan menjalankan Cleanup.bat setelah Anda selesai dengan sampel. Sampel keamanan lainnya menggunakan sertifikat yang sama.

  3. Luncurkan service.exe dari service\bin.

  4. Luncurkan Client.exe dari \client\bin. Aktivitas klien ditampilkan di aplikasi konsol klien.

  5. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.

Untuk menjalankan sampel di seluruh komputer

  1. Juga salin file Setup.bat, Cleanup.bat, dan ImportClientCert.bat ke komputer layanan.

  2. Buat direktori di komputer klien untuk binari klien.

  3. Salin file program klien ke direktori klien di komputer klien. Salin juga file Setup.bat, Cleanup.bat, dan ImportServiceCert.bat ke klien.

  4. Di server, jalankan setup.bat service. Menjalankan setup.bat dengan argumen service akan membuat sertifikat layanan dengan nama domain komputer yang sepenuhnya memenuhi syarat dan mengekspor sertifikat layanan ke file yang dinamai Service.cer.

  5. Edit service.exe.config untuk mencerminkan nama sertifikat baru (dalam atribut findValue di <serviceCertificate>) yang sama dengan nama domain komputer yang sepenuhnya memenuhi syarat.

  6. Salin file Service.cer dari direktori layanan ke direktori klien di komputer klien.

  7. Pada klien, jalankan setup.bat client. Menjalankan setup.bat dengan argumen client membuat sertifikat klien bernama client.com dan mengekspor sertifikat klien ke file bernama Client.cer.

  8. Di file Client.exe.config di komputer klien, ubah nilai alamat titik akhir agar sesuai dengan alamat baru layanan Anda. Lakukan ini dengan mengganti localhost dengan nama domain server yang sepenuhnya memenuhi syarat. Anda juga harus mengubah nama sertifikat layanan agar sama dengan nama domain komputer layanan yang sepenuhnya memenuhi syarat (dalam atribut findValue dalam elemen defaultCertificate dari serviceCertificate di bawah clientCredentials).

  9. Salin file Client.cer dari direktori klien ke direktori layanan di server.

  10. Pada klien, jalankan ImportServiceCert.bat. Langkah ini mengimpor sertifikat layanan dari file Service.cer ke penyimpanan CurrentUser - TrustedPeople.

  11. Di server, jalankan ImportClientCert.bat, Ini mengimpor sertifikat klien dari file Client.cer ke penyimpanan LocalMachine - TrustedPeople.

  12. Di komputer layanan, luncurkan Service.exe dari perintah.

  13. Di komputer klien, luncurkan Client.exe dari perintah. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.

Untuk membersihkan sampel

  • Jalankan Cleanup.bat di folder sampel setelah Anda selesai menjalankan sampel.

    Catatan

    Skrip ini tidak menghapus sertifikat layanan pada klien saat menjalankan sampel ini di seluruh komputer. Jika Anda telah menjalankan sampel Windows Communication Foundation (WCF) yang menggunakan sertifikat di seluruh komputer, pastikan untuk menghapus sertifikat layanan yang telah terpasang di penyimpanan CurrentUser - TrustedPeople. Untuk melakukannya, gunakan perintah berikut: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Misalnya: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Persyaratan

Sampel ini mengharuskan MSMQ diinstal dan berjalan.

Menunjukkan

Klien mengenkripsi pesan menggunakan kunci publik layanan dan menandatangani pesan menggunakan sertifikatnya sendiri. Layanan membaca pesan dari antrean mengautentikasi sertifikat klien dengan sertifikat di penyimpanan orang tepercayanya. Kemudian mendekripsi pesan dan mengirimkan pesan ke operasi layanan.

Karena pesan Windows Communication Foundation (WCF) dibawa sebagai payload dalam isi pesan MSMQ, isinya tetap dienkripsi di penyimpanan MSMQ. Ini mengamankan pesan dari pengungkapan pesan yang tidak diinginkan. Perhatikan bahwa MSMQ sendiri tidak menyadari apakah pesan yang dibawanya dienkripsi.

Sampel menunjukkan bagaimana autentikasi bersama di tingkat pesan dapat digunakan dengan MSMQ. Sertifikat ditukar secara out-of-band. Ini selalu terjadi pada aplikasi yang diantrekan karena layanan dan klien tidak harus aktif dan berjalan pada saat yang sama.

Deskripsi

Contoh klien dan kode layanan sama dengan sampel Pengikatan MSMQ yang Ditransaksikan dengan satu perbedaan. Kontrak operasi dianotasikan dengan tingkat perlindungan, yang menunjukkan bahwa pesan harus ditandatangani dan dienkripsi.

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

Untuk memastikan bahwa pesan diamankan menggunakan token yang diperlukan untuk mengidentifikasi layanan dan klien, App.config berisi informasi kredensial.

Konfigurasi klien menentukan sertifikat layanan untuk mengautentikasi layanan. Ini menggunakan penyimpanan LocalMachine sebagai penyimpanan tepercaya untuk mengandalkan validitas layanan. Ini juga menentukan sertifikat klien yang dilampirkan dengan pesan untuk autentikasi layanan klien.

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

Perhatikan bahwa mode keamanan diatur ke Pesan dan ClientCredentialType diatur ke Sertifikat.

Konfigurasi layanan mencakup perilaku layanan yang menentukan kredensial layanan yang digunakan saat klien mengautentikasi layanan. Nama subjek sertifikat server ditentukan dalam atribut findValue dalam elemen <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>

Sampel menunjukkan autentikasi kontrol dengan menggunakan konfigurasi dan cara mendapatkan identitas pemanggil dari konteks keamanan, seperti yang ditunjukkan dalam kode sampel berikut:

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

Saat dijalankan, kode layanan menampilkan identifikasi klien. Berikut ini adalah sampel output dari kode layanan:

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

Komentar

  • Membuat sertifikat klien.

    Baris berikut dalam file batch membuat sertifikat klien. Nama klien yang ditentukan digunakan dalam nama subjek sertifikat yang dibuat. Sertifikat disimpan di penyimpanan My di lokasi penyimpanan CurrentUser.

    echo ************
    echo making client cert
    echo ************
    makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
    
  • Memasang sertifikat klien ke penyimpanan sertifikat tepercaya server.

    Baris berikut dalam file batch menyalin sertifikat klien ke penyimpanan TrustedPeople server sehingga server dapat membuat keputusan kepercayaan atau tanpa kepercayaan yang relevan. Agar sertifikat yang diinstal di penyimpanan TrustedPeople dipercaya oleh layanan Windows Communication Foundation (WCF), mode validasi sertifikat klien harus diatur ke PeerOrChainTrust atau PeerTrust. Lihat sampel konfigurasi layanan sebelumnya untuk mempelajari bagaimana hal ini dapat dilakukan dengan menggunakan file konfigurasi.

    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
    
  • Membuat sertifikat server.

    Baris berikut dari file batch Setup.bat membuat sertifikat server yang akan digunakan:

    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
    

    Variabel %SERVER_NAME% menentukan nama server. Sertifikat tersebut disimpan di penyimpanan LocalMachine. Jika berkas kumpulan penyiapan dijalankan dengan argumen layanan (seperti setup.bat service), %SERVER_NAME% berisi nama domain komputer yang sepenuhnya memenuhi syarat

  • Memasang sertifikat server ke penyimpanan sertifikat tepercaya klien.

    Baris berikut menyalin sertifikat server ke penyimpanan orang tepercaya klien. Langkah ini diperlukan karena sertifikat yang dihasilkan oleh Makecert.exe tidak dipercaya secara implisit oleh sistem klien. Jika Anda sudah memiliki sertifikat yang di-root di sertifikat root tepercaya klien—misalnya, sertifikat yang diterbitkan Microsoft—langkah mengisi penyimpanan sertifikat klien dengan sertifikat server ini tidak diperlukan.

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

    Catatan

    Jika Anda menggunakan Microsoft Windows edisi bahasa Inggris non-AS, Anda harus mengedit file Setup.bat dan mengganti nama akun "NT AUTHORITY\NETWORK SERVICE" dengan nama regional Anda yang setara.