Share via


A kommunikáció biztonságossá tételének biztosítása C#-szolgáltatásban

A biztonság a kommunikáció egyik legfontosabb eleme. A Reliable Services alkalmazás-keretrendszer néhány előre összeállított kommunikációs vermet és eszközt biztosít, amelyekkel javíthatja a biztonságot. Ez a cikk azt ismerteti, hogyan javíthatja a biztonságot, ha szolgáltatásátírást használ egy C#-szolgáltatásban. Egy meglévő példára épül, amely leírja, hogyan állíthatja be a C# nyelven írt megbízható szolgáltatásokhoz való átnevezést.

A szolgáltatás C#-szolgáltatásokkal való újraindítása során a szolgáltatás biztonságossá tételéhez kövesse az alábbi lépéseket:

  1. Hozzon létre egy felületet (), IHelloWorldStatefulamely meghatározza a távoli eljáráshíváshoz elérhető metódusokat a szolgáltatásban. A szolgáltatás a nevet fogja használni FabricTransportServiceRemotingListener, amely a Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime névtérben van deklarálva. Ez egy ICommunicationListener olyan implementáció, amely újraegyeztetési képességeket biztosít.

    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. Adjon hozzá figyelőbeállításokat és biztonsági hitelesítő adatokat.

    Győződjön meg arról, hogy a szolgáltatás kommunikációjának biztonságossá tételéhez használni kívánt tanúsítvány telepítve van a fürt összes csomópontján.

    Megjegyzés

    Linux-csomópontokon a tanúsítványnak PEM formátumú fájlként kell szerepelnie a /var/lib/sfcerts könyvtárban. További információ: Az X.509-tanúsítványok helye és formátuma Linux-csomópontokon.

    Kétféleképpen adhatja meg a figyelő beállításait és a biztonsági hitelesítő adatokat:

    1. Adja meg őket közvetlenül a szolgáltatáskódban:

      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. Adja meg őket egy konfigurációs csomag használatával:

      Adjon hozzá egy elnevezett TransportSettings szakaszt a settings.xml fájlhoz.

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

      Ebben az esetben a metódus a CreateServiceReplicaListeners következőképpen fog kinézni:

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

      Ha hozzáad egy szakaszt TransportSettings a settings.xml fájlhoz, FabricTransportRemotingListenerSettings alapértelmezés szerint betölti a szakasz összes beállítását.

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

      Ebben az esetben a metódus a CreateServiceReplicaListeners következőképpen fog kinézni:

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
      {
          return new[]
          {
              return new[]{
                      new ServiceReplicaListener(
                          (context) => new FabricTransportServiceRemotingListener(context,this))};
          };
      }
      
  3. Ha metódusokat hív meg egy biztonságos szolgáltatáson a visszahívási verem használatával, ahelyett, hogy a osztályt használva hoz létre szolgáltatásproxyt, használja a Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy parancsot Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory. Adja meg a következőt: FabricTransportRemotingSettings, amely tartalmazza a következőt 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();
    
    

    Ha az ügyfélkód egy szolgáltatás részeként fut, az settings.xml fájlból tölthető be FabricTransportRemotingSettings . Hozzon létre egy, a szolgáltatáskódhoz hasonló HelloWorldClientTransportSettings szakaszt, ahogy azt korábban is láthattuk. Végezze el a következő módosításokat az ügyfélkódon:

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

    Ha az ügyfél nem egy szolgáltatás részeként fut, létrehozhat egy client_name.settings.xml fájlt ugyanazon a helyen, ahol a client_name.exe található. Ezután hozzon létre egy TransportSettings szakaszt a fájlban.

    A szolgáltatáshoz hasonlóan, ha hozzáad egy szakaszt TransportSettings az ügyfél settings.xml/client_name.settings.xml, FabricTransportRemotingSettings alapértelmezés szerint betölti a szakasz összes beállítását.

    Ebben az esetben a korábbi kód még egyszerűbb:

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

Következő lépésként olvassa el a Web API és az OWIN együttes használatát a Reliable Servicesben.