Sdílet prostřednictvím


Zabezpečená komunikace mezi službami ve službě Java

Zabezpečení je jedním z nejdůležitějších aspektů komunikace. Architektura aplikace Reliable Services poskytuje několik předem připravených komunikačních zásobníků a nástrojů, které můžete použít ke zlepšení zabezpečení. Tento článek popisuje, jak zlepšit zabezpečení při používání vzdálené komunikace služby ve službě Java. Vychází z existujícího příkladu , který vysvětluje, jak nastavit vzdálenou komunikace pro spolehlivé služby napsané v Javě.

Pokud chcete pomoct zabezpečit službu při použití vzdálené komunikace služby se službami Java, postupujte takto:

  1. Vytvořte rozhraní , HelloWorldStatelesskteré definuje metody, které budou k dispozici pro vzdálené volání procedur ve vaší službě. Vaše služba bude používat FabricTransportServiceRemotingListener, který je deklarován v microsoft.serviceFabric.services.remoting.fabricTransport.runtime balíčku. Jedná se o CommunicationListener implementaci, která poskytuje možnosti vzdálené komunikace.

    public interface HelloWorldStateless extends Service {
        CompletableFuture<String> getHelloWorld();
    }
    
    class HelloWorldStatelessImpl extends StatelessService implements HelloWorldStateless {
        @Override
        protected List<ServiceInstanceListener> createServiceInstanceListeners() {
            ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
            listeners.add(new ServiceInstanceListener((context) -> {
                return new FabricTransportServiceRemotingListener(context,this);
            }));
        return listeners;
        }
    
        public CompletableFuture<String> getHelloWorld() {
            return CompletableFuture.completedFuture("Hello World!");
        }
    }
    
  2. Přidejte nastavení naslouchacího procesu a přihlašovací údaje zabezpečení.

    Ujistěte se, že je certifikát, který chcete použít k zabezpečení komunikace služby, nainstalovaný na všech uzlech v clusteru. Pro služby spuštěné v Linuxu musí být certifikát k dispozici jako soubor s formátem PEM. .pem Soubor obsahující certifikát a privátní klíč nebo .crt soubor obsahující certifikát a .key soubor, který obsahuje privátní klíč. Další informace najdete v tématu Umístění a formát certifikátů X.509 na uzlech Linuxu.

    Nastavení naslouchacího procesu a přihlašovací údaje zabezpečení můžete zadat dvěma způsoby:

    1. Zadejte je pomocí konfiguračního balíčku:

      Do souboru settings.xml přidejte pojmenovaný TransportSettings oddíl.

      <!--Section name should always end with "TransportSettings".-->
      <!--Here we are using a prefix "HelloWorldStateless".-->
       <Section Name="HelloWorldStatelessTransportSettings">
           <Parameter Name="MaxMessageSize" Value="10000000" />
           <Parameter Name="SecurityCredentialsType" Value="X509_2" />
           <Parameter Name="CertificatePath" Value="/path/to/cert/BD1C71E248B8C6834C151174DECDBDC02DE1D954.crt" />
           <Parameter Name="CertificateProtectionLevel" Value="EncryptandSign" />
           <Parameter Name="CertificateRemoteThumbprints" Value="BD1C71E248B8C6834C151174DECDBDC02DE1D954" />
       </Section>
      
      

      V tomto případě createServiceInstanceListeners bude metoda vypadat takto:

       protected List<ServiceInstanceListener> createServiceInstanceListeners() {
           ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
           listeners.add(new ServiceInstanceListener((context) -> {
               return new FabricTransportServiceRemotingListener(context,this, FabricTransportRemotingListenerSettings.loadFrom(HelloWorldStatelessTransportSettings));
           }));
           return listeners;
       }
      

      Pokud do souboru settings.xml přidáte TransportSettings oddíl bez předpony, FabricTransportListenerSettings načte ve výchozím nastavení všechna nastavení z tohoto oddílu.

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

      V tomto případě CreateServiceInstanceListeners bude metoda vypadat takto:

      protected List<ServiceInstanceListener> createServiceInstanceListeners() {
          ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
          listeners.add(new ServiceInstanceListener((context) -> {
              return new FabricTransportServiceRemotingListener(context,this);
          }));
          return listeners;
      }
      
  3. Při volání metod v zabezpečené službě pomocí zásobníku vzdálené komunikace místo použití microsoft.serviceFabric.services.remoting.client.ServiceProxyBase třídy k vytvoření proxy služby použijte microsoft.serviceFabric.services.remoting.client.FabricServiceProxyFactory.

    Pokud je kód klienta spuštěný jako součást služby, můžete načíst FabricTransportSettings ze souboru settings.xml. Vytvořte část TransportSettings, která se podobá kódu služby, jak je znázorněno výše. Proveďte následující změny v kódu klienta:

    
    FabricServiceProxyFactory serviceProxyFactory = new FabricServiceProxyFactory(c -> {
            return new FabricTransportServiceRemotingClientFactory(FabricTransportRemotingSettings.loadFrom("TransportPrefixTransportSettings"), null, null, null, null);
        }, null)
    
    HelloWorldStateless client = serviceProxyFactory.createServiceProxy(HelloWorldStateless.class,
        new URI("fabric:/MyApplication/MyHelloWorldService"));
    
    CompletableFuture<String> message = client.getHelloWorld();