Bagikan melalui


Mengamankan komunikasi layanan jarak jauh pada layanan C#

Keamanan adalah salah satu aspek terpenting dalam komunikasi. Kerangka kerja aplikasi Layanan Andal menyediakan beberapa tumpukan dan alat komunikasi bawaan yang dapat digunakan untuk meningkatkan keamanan. Artikel ini membahas cara meningkatkan keamanan saat Anda menggunakan jarak jauh layanan di layanan C#. Ini dibangun berdasarkan contoh yang sudah ada yang menjelaskan cara menyiapkan jarak jauh untuk layanan andal yang ditulis dalam C#.

Untuk membantu mengamankan layanan saat Anda menggunakan jarak jauh layanan dengan layanan C#, ikuti langkah-langkah berikut:

  1. Buat antarmuka, IHelloWorldStateful, yang menentukan metode yang akan tersedia untuk panggilan prosedur jarak jauh pada layanan Anda. Layanan Anda akan menggunakan FabricTransportServiceRemotingListener, yang dinyatakan dalam namespace Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime. Ini adalah implementasi ICommunicationListener yang memberikan kemampuan jarak jauh.

    public interface IHelloWorldStateful : IService
    {
        Task<string> GetHelloWorld();
    }
    
    internal class HelloWorldStateful : StatefulService, IHelloWorldStateful
    {
        protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
        {
            return new[]{
                    new ServiceReplicaListener(
                        (context) => new FabricTransportServiceRemotingListener(context,this))};
        }
    
        public Task<string> GetHelloWorld()
        {
            return Task.FromResult("Hello World!");
        }
    }
    
  2. Tambahkan pengaturan pendengar dan mandat keamanan.

    Pastikan sertifikat yang ingin Anda gunakan untuk membantu mengamankan komunikasi layanan Anda diinstal pada semua node di kluster.

    Catatan

    Pada node Linux, sertifikat harus hadir sebagai file dengan format dalam direktori /var/lib/sfcerts. Untuk mempelajari lebih lanjut, lihat Lokasi dan format sertifikat X.509 pada node Linux.

    Ada dua cara untuk menyediakan pengaturan pendengar dan mandat keamanan:

    1. Berikan mereka langsung dalam kode layanan:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          FabricTransportRemotingListenerSettings  listenerSettings = new FabricTransportRemotingListenerSettings
          {
              MaxMessageSize = 10000000,
              SecurityCredentials = GetSecurityCredentials()
          };
          return new[]
          {
              new ServiceReplicaListener(
                  (context) => new FabricTransportServiceRemotingListener(context,this,listenerSettings))
          };
      }
      
      private static SecurityCredentials GetSecurityCredentials()
      {
          // Provide certificate details.
          var x509Credentials = new X509Credentials
          {
              FindType = X509FindType.FindByThumbprint,
              FindValue = "4FEF3950642138446CC364A396E1E881DB76B48C",
              StoreLocation = StoreLocation.LocalMachine,
              StoreName = "My",
              ProtectionLevel = ProtectionLevel.EncryptAndSign
          };
          x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert");
          x509Credentials.RemoteCertThumbprints.Add("9FEF3950642138446CC364A396E1E881DB76B483");
          return x509Credentials;
      }
      
    2. Sediakan menggunakan paket konfigurasi:

      Tambahkan bagian bernama TransportSettings dalam file settings.xml.

      <Section Name="HelloWorldStatefulTransportSettings">
          <Parameter Name="MaxMessageSize" Value="10000000" />
          <Parameter Name="SecurityCredentialsType" Value="X509" />
          <Parameter Name="CertificateFindType" Value="FindByThumbprint" />
          <Parameter Name="CertificateFindValue" Value="4FEF3950642138446CC364A396E1E881DB76B48C" />
          <Parameter Name="CertificateRemoteThumbprints" Value="9FEF3950642138446CC364A396E1E881DB76B483" />
          <Parameter Name="CertificateStoreLocation" Value="LocalMachine" />
          <Parameter Name="CertificateStoreName" Value="My" />
          <Parameter Name="CertificateProtectionLevel" Value="EncryptAndSign" />
          <Parameter Name="CertificateRemoteCommonNames" Value="ServiceFabric-Test-Cert" />
      </Section>
      

      Dalam hal ini, metode CreateServiceReplicaListeners akan terlihat seperti ini:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          return new[]
          {
              new ServiceReplicaListener(
                  (context) => new FabricTransportServiceRemotingListener(
                      context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings")))
          };
      }
      

      Jika Anda menambahkan bagian TransportSettings dalam file settings.xml, FabricTransportRemotingListenerSettings akan membuat semua pengaturan dari bagian ini secara default.

      <!--"TransportSettings" section .-->
      <Section Name="TransportSettings">
          ...
      </Section>
      

      Dalam hal ini, metode CreateServiceReplicaListeners akan terlihat seperti ini:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          return new[]
          {
              return new[]{
                      new ServiceReplicaListener(
                          (context) => new FabricTransportServiceRemotingListener(context,this))};
          };
      }
      
  3. Anda bisa memanggil metode pada layanan aman menggunakan tumpukan jarak jauh, alih-alih menggunakan kelas Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy untuk membuat proksi layanan, menggunakan Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory. Lolos dalam FabricTransportRemotingSettings, yang berisi SecurityCredentials.

    
    var x509Credentials = new X509Credentials
    {
        FindType = X509FindType.FindByThumbprint,
        FindValue = "9FEF3950642138446CC364A396E1E881DB76B483",
        StoreLocation = StoreLocation.LocalMachine,
        StoreName = "My",
        ProtectionLevel = ProtectionLevel.EncryptAndSign
    };
    x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert");
    x509Credentials.RemoteCertThumbprints.Add("4FEF3950642138446CC364A396E1E881DB76B48C");
    
    FabricTransportRemotingSettings transportSettings = new FabricTransportRemotingSettings
    {
        SecurityCredentials = x509Credentials,
    };
    
    ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(
        (c) => new FabricTransportServiceRemotingClientFactory(transportSettings));
    
    IHelloWorldStateful client = serviceProxyFactory.CreateServiceProxy<IHelloWorldStateful>(
        new Uri("fabric:/MyApplication/MyHelloWorldService"));
    
    string message = await client.GetHelloWorld();
    
    

    Jika kode klien berjalan sebagai bagian dari layanan, Anda dapat memuat FabricTransportRemotingSettings dari file settings.xml. Buat bagian HelloWorldClientTransportSettings yang sama dengan kode layanan, sebagaimana ditampilkan sebelumnya. Lakukan perubahan berikut ini pada kode klien:

    ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory(
        (c) => new FabricTransportServiceRemotingClientFactory(FabricTransportRemotingSettings.LoadFrom("HelloWorldClientTransportSettings")));
    
    IHelloWorldStateful client = serviceProxyFactory.CreateServiceProxy<IHelloWorldStateful>(
        new Uri("fabric:/MyApplication/MyHelloWorldService"));
    
    string message = await client.GetHelloWorld();
    
    

    Jika klien tidak berjalan sebagai bagian dari layanan, Anda dapat membuat file client_name.settings.xml pada lokasi yang sama dengan client_name.exe berada. Kemudian, tambahkan bagian TransportSettings dalam file tersebut.

    Mirip dengan layanan, jika Anda menambahkan bagian TransportSettings dalam klien settings.xml/client_name.settings.xml, FabricTransportRemotingSettings memuat semua pengaturan dari bagian ini secara default.

    Dalam hal ini, kode sebelumnya bahkan disederhanakan lebih lanjut:

    
    IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>(
                 new Uri("fabric:/MyApplication/MyHelloWorldService"));
    
    string message = await client.GetHelloWorld();
    
    

Langkah selanjutnya, baca Web API dengan OWIN di Reliable Services.