Bezpieczna komunikacja zdalna usługi w usłudze Java

Bezpieczeństwo jest jednym z najważniejszych aspektów komunikacji. Platforma aplikacji Reliable Services udostępnia kilka wstępnie utworzonych stosów komunikacji i narzędzi, których można użyć do poprawy bezpieczeństwa. W tym artykule omówiono sposób poprawiania zabezpieczeń podczas korzystania z komunikacji zdalniej usługi w usłudze Java. Opiera się on na istniejącym przykładzie , który wyjaśnia, jak skonfigurować zdalną obsługę usług niezawodnych napisanych w języku Java.

Aby zabezpieczyć usługę w przypadku korzystania z komunikacji zdalnej usługi z usługami Java, wykonaj następujące kroki:

  1. Utwórz interfejs , HelloWorldStatelessktóry definiuje metody, które będą dostępne dla zdalnego wywołania procedury w usłudze. Usługa będzie używać FabricTransportServiceRemotingListenerelementu , który jest zadeklarowany w pakiecie microsoft.serviceFabric.services.remoting.fabricTransport.runtime . Jest to implementacja CommunicationListener , która zapewnia możliwości komunikacji zdalniej.

    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. Dodaj ustawienia odbiornika i poświadczenia zabezpieczeń.

    Upewnij się, że certyfikat, którego chcesz użyć, aby ułatwić zabezpieczenie komunikacji z usługą, jest zainstalowany na wszystkich węzłach w klastrze. W przypadku usług działających w systemie Linux certyfikat musi być dostępny jako plik PEM-formmatted; .pem plik zawierający certyfikat i klucz prywatny lub .crt plik zawierający certyfikat i .key plik zawierający klucz prywatny. Aby dowiedzieć się więcej, zobacz Lokalizacja i format certyfikatów X.509 w węzłach systemu Linux.

    Istnieją dwa sposoby udostępniania ustawień odbiornika i poświadczeń zabezpieczeń:

    1. Podaj je przy użyciu pakietu konfiguracji:

      Dodaj nazwaną TransportSettings sekcję w pliku settings.xml.

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

      W takim przypadku createServiceInstanceListeners metoda będzie wyglądać następująco:

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

      Jeśli dodasz sekcję TransportSettings w pliku settings.xml bez żadnego prefiksu, FabricTransportListenerSettings domyślnie załaduje wszystkie ustawienia z tej sekcji.

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

      W takim przypadku CreateServiceInstanceListeners metoda będzie wyglądać następująco:

      protected List<ServiceInstanceListener> createServiceInstanceListeners() {
          ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
          listeners.add(new ServiceInstanceListener((context) -> {
              return new FabricTransportServiceRemotingListener(context,this);
          }));
          return listeners;
      }
      
  3. W przypadku wywoływania metod w zabezpieczonej usłudze przy użyciu stosu komunikacji telefonicznej zamiast używania microsoft.serviceFabric.services.remoting.client.ServiceProxyBase klasy do utworzenia serwera proxy usługi użyj polecenia microsoft.serviceFabric.services.remoting.client.FabricServiceProxyFactory.

    Jeśli kod klienta jest uruchomiony w ramach usługi, możesz załadować FabricTransportSettings go z pliku settings.xml. Utwórz sekcję TransportSettings podobną do kodu usługi, jak pokazano wcześniej. Wprowadź następujące zmiany w kodzie 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();