Dela via


Säker fjärrkommunikation för tjänster i en Java-tjänst

Säkerhet är en av de viktigaste aspekterna av kommunikation. Reliable Services-programramverket innehåller några fördefinierade kommunikationsstackar och verktyg som du kan använda för att förbättra säkerheten. I den här artikeln beskrivs hur du kan förbättra säkerheten när du använder tjänstmoting i en Java-tjänst. Den bygger på ett befintligt exempel som förklarar hur du konfigurerar fjärrkommunikation för tillförlitliga tjänster som skrivits i Java.

Följ dessa steg för att skydda en tjänst när du använder tjänstmoting med Java-tjänster:

  1. Skapa ett gränssnitt, HelloWorldStateless, som definierar de metoder som ska vara tillgängliga för ett fjärrproceduranrop i tjänsten. Tjänsten använder FabricTransportServiceRemotingListener, som deklareras i microsoft.serviceFabric.services.remoting.fabricTransport.runtime paketet. Det här är en CommunicationListener implementering som tillhandahåller fjärrkommunikationsfunktioner.

    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. Lägg till lyssnarinställningar och säkerhetsautentiseringsuppgifter.

    Kontrollera att certifikatet som du vill använda för att skydda tjänstkommunikationen är installerat på alla noder i klustret. För tjänster som körs på Linux måste certifikatet vara tillgängligt som en PEM-formmaterad fil. antingen en .pem fil som innehåller certifikatet och den privata nyckeln eller en .crt fil som innehåller certifikatet och en .key fil som innehåller den privata nyckeln. Mer information finns i Plats och format för X.509-certifikat på Linux-noder.

    Du kan ange lyssningsinställningar och säkerhetsautentiseringsuppgifter på två sätt:

    1. Ange dem med hjälp av ett konfigurationspaket:

      Lägg till ett namngivet TransportSettings avsnitt i filen 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>
      
      

      I det här fallet createServiceInstanceListeners ser metoden ut så här:

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

      Om du lägger till ett TransportSettings avsnitt i filen settings.xml utan prefix FabricTransportListenerSettings läser du in alla inställningar från det här avsnittet som standard.

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

      I det här fallet CreateServiceInstanceListeners ser metoden ut så här:

      protected List<ServiceInstanceListener> createServiceInstanceListeners() {
          ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
          listeners.add(new ServiceInstanceListener((context) -> {
              return new FabricTransportServiceRemotingListener(context,this);
          }));
          return listeners;
      }
      
  3. När du anropar metoder för en säker tjänst med hjälp av fjärrkommunikationsstacken använder microsoft.serviceFabric.services.remoting.client.FabricServiceProxyFactorydu i stället för att använda microsoft.serviceFabric.services.remoting.client.ServiceProxyBase klassen för att skapa en tjänstproxy.

    Om klientkoden körs som en del av en tjänst kan du läsa in FabricTransportSettings från filen settings.xml. Skapa ett TransportSettings-avsnitt som liknar tjänstkoden, som du visade tidigare. Gör följande ändringar i klientkoden:

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