Sertifikat Keamanan Pesan

Sampel MessageSecurity menunjukkan cara mengimplementasikan aplikasi yang menggunakan WS-Security dengan autentikasi sertifikat X.509 v3 untuk klien dan memerlukan autentikasi server menggunakan sertifikat X.509 v3 server. Sampel ini menggunakan pengaturan default sehingga semua pesan aplikasi antara klien dan server ditandatangani dan dienkripsi. Sampel ini didasarkan pada WSHttpBinding dan terdiri dari program konsol klien dan pustaka layanan yang dihosting oleh Internet Information Services (IIS). Layanan ini menerapkan kontrak yang mendefinisikan pola komunikasi balasan permintaan.

Nota

Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.

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

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;
    }
    ...
}

Layanan ini mengekspos satu titik akhir untuk berkomunikasi dengan layanan dan satu titik akhir untuk mengekspos dokumen WSDL layanan menggunakan protokol WS-MetadataExchange, yang ditentukan dengan menggunakan file konfigurasi (Web.config). Titik akhir terdiri dari alamat, pengikatan, dan kontrak. Pengikatan dikonfigurasi dengan elemen <wsHttpBinding> standar, yang secara default menggunakan keamanan pesan. Sampel ini mengatur atribut clientCredentialType ke Sertifikat untuk memerlukan autentikasi klien.

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

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

Konfigurasi titik akhir klien terdiri dari alamat absolut untuk titik akhir layanan, pengikatan, dan kontrak. Pengikatan klien dikonfigurasi dengan mode keamanan dan mode autentikasi yang sesuai. Saat berjalan dalam skenario lintas komputer, pastikan bahwa alamat titik akhir layanan diubah sesuai.

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

Implementasi klien dapat mengatur sertifikat yang akan digunakan, baik melalui file konfigurasi atau melalui kode. Contoh berikut menunjukkan cara mengatur sertifikat yang akan digunakan dalam file konfigurasi.

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

Contoh berikut menunjukkan cara memanggil layanan dalam program Anda.

// 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();

Saat Anda menjalankan sampel, permintaan dan respons operasi ditampilkan di jendela konsol klien. Tekan ENTER di jendela klien untuk mematikan klien.

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.

File batch Setup.bat yang disertakan dengan sampel Keamanan Pesan memungkinkan Anda mengonfigurasi klien dan server dengan sertifikat yang relevan untuk menjalankan aplikasi yang dihosting yang memerlukan keamanan berbasis sertifikat. File batch dapat dijalankan dalam tiga mode. Untuk menjalankan dalam mode komputer tunggal, ketik setup.bat di Prompt Perintah Pengembang untuk Visual Studio; sedangkan untuk mode layanan, ketik setup.bat layanan; dan untuk mode klien, ketik setup.bat klien. Gunakan mode klien dan server saat menjalankan sampel di seluruh komputer. Lihat prosedur penyiapan di akhir topik ini untuk detailnya. Berikut ini memberikan gambaran singkat tentang berbagai bagian file batch sehingga dapat dimodifikasi untuk dijalankan dalam konfigurasi yang sesuai:

  • 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 toko My pada lokasi toko CurrentUser.

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

    Baris berikut dalam file batch menyalin sertifikat klien ke penyimpanan TrustedPeople server sehingga server dapat membuat kepercayaan yang relevan atau keputusan tanpa kepercayaan. 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 disimpan di penyimpanan LocalMachine. Jika file batch Setup.bat dijalankan dengan argumen layanan (seperti layanan setup.bat) %SERVER_NAME% berisi nama domain komputer yang sepenuhnya memenuhi syarat. Jika tidak, defaultnya ke localhost.

  • Menginstal 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 berakar pada sertifikat akar tepercaya klien—misalnya, sertifikat yang dikeluarkan Microsoft—langkah mengisi penyimpanan sertifikat klien dengan sertifikat server tidak diperlukan.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Memberikan izin pada kunci privat sertifikat.

    Baris berikut dalam file Setup.bat membuat sertifikat server yang disimpan di penyimpanan LocalMachine dapat diakses oleh akun proses pekerja 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
    

    Nota

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

Nota

Alat yang digunakan dalam file batch ini terletak di C:\Program Files\Microsoft Visual Studio 8\Common7\tools atau C:\Program Files\Microsoft SDKs\Windows\v6.0\bin. Salah satu direktori ini harus berada di jalur sistem Anda. Jika Anda telah menginstal Visual Studio, cara termudah untuk mendapatkan direktori ini di path Anda adalah dengan membuka Prompt Perintah Pengembang untuk Visual Studio. Klik Mulai, lalu pilih Semua Program, Visual Studio 2012, Alat. Perintah ini memiliki jalur yang sesuai yang sudah dikonfigurasi. Jika tidak, Anda harus menambahkan direktori yang sesuai ke jalur Anda secara manual.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti instruksi di Membangun Sampel Windows Communication Foundation.

Untuk menjalankan sampel pada komputer yang sama

  1. Buka Perintah Pengembang untuk Visual Studio dengan hak istimewa administrator dan jalankan Setup.bat dari folder penginstalan sampel. Ini menginstal semua sertifikat yang diperlukan untuk menjalankan sampel.

    Nota

    File batch Setup.bat dirancang untuk dijalankan dari Command Prompt Pengembang untuk Visual Studio. Ini mengharuskan variabel lingkungan jalur menunjuk ke direktori tempat SDK diinstal. Variabel lingkungan ini secara otomatis diatur dalam Perintah Pengembang untuk Visual Studio (2010).

  2. Verifikasi akses ke layanan menggunakan browser dengan memasukkan alamat http://localhost/servicemodelsamples/service.svc.

  3. Luncurkan Client.exe dari \client\bin. Aktivitas klien ditampilkan pada aplikasi konsol klien.

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

Untuk menjalankan contoh program di berbagai komputer

  1. Buat direktori pada komputer layanan. Buat aplikasi virtual bernama servicemodelsamples untuk direktori ini dengan menggunakan alat manajemen Internet Information Services (IIS).

  2. Salin file program layanan dari \inetpub\wwwroot\servicemodelsamples ke direktori virtual di komputer layanan. Pastikan Anda menyalin file di subdirektori \bin. Salin juga file Setup.bat, Cleanup.bat, dan ImportClientCert.bat ke komputer layanan.

  3. Buat direktori di komputer klien untuk biner klien.

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

  5. Di server, jalankan layanan setup.bat di Developer Command Prompt untuk Visual Studio dengan akses administrator. Menjalankan setup.bat dengan argumen layanan membuat sertifikat layanan dengan nama domain komputer yang sepenuhnya memenuhi syarat dan mengekspor sertifikat layanan ke file bernama Service.cer.

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

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

  8. Pada klien, jalankan setup.bat klien di Prompt Perintah Pengembang untuk Visual Studio dengan izin administrator. Menjalankan setup.bat dengan argumen klien membuat sertifikat klien bernama client.com dan mengekspor sertifikat klien ke file bernama Client.cer.

  9. Dalam 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.

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

  11. Pada klien, jalankan ImportServiceCert.bat di Perintah Pengembang untuk Visual Studio dengan hak istimewa administratif. Ini mengimpor sertifikat layanan dari file Service.cer ke penyimpanan CurrentUser - TrustedPeople.

  12. Di server, jalankan ImportClientCert.bat di Prompt Perintah Pengembang untuk Visual Studio dengan hak istimewa administratif. Ini mengimpor sertifikat klien dari file Client.cer ke penyimpanan LocalMachine - TrustedPeople.

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

Untuk membersihkan setelah sampel

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

    Nota

    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 diinstal di penyimpanan CurrentUser - TrustedPeople. Untuk melakukan ini, 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.