Share via


Communicatie tussen externe services in een Java-service beveiligen

Beveiliging is een van de belangrijkste aspecten van communicatie. Het Reliable Services-toepassingsframework biedt enkele vooraf gemaakte communicatiestacks en hulpprogramma's die u kunt gebruiken om de beveiliging te verbeteren. In dit artikel wordt beschreven hoe u de beveiliging kunt verbeteren wanneer u externe services gebruikt in een Java-service. Het bouwt voort op een bestaand voorbeeld waarin wordt uitgelegd hoe u externe toegang instelt voor betrouwbare services die zijn geschreven in Java.

Voer de volgende stappen uit om een service te beveiligen wanneer u externe services van services gebruikt:

  1. Maak een interface, HelloWorldStatelesswaarmee de methoden worden gedefinieerd die beschikbaar zijn voor een externe procedureaanroep op uw service. Uw service gebruikt FabricTransportServiceRemotingListener, die in het microsoft.serviceFabric.services.remoting.fabricTransport.runtime pakket wordt gedeclareerd. Dit is een CommunicationListener implementatie die externe mogelijkheden biedt.

    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. Voeg listenerinstellingen en beveiligingsreferenties toe.

    Zorg ervoor dat het certificaat dat u wilt gebruiken om uw servicecommunicatie te beveiligen, is geïnstalleerd op alle knooppunten in het cluster. Voor services die worden uitgevoerd op Linux, moet het certificaat beschikbaar zijn als een PEM-bestand met formmatted; .pem een bestand met het certificaat en de persoonlijke sleutel of een .crt bestand dat het certificaat bevat en een .key bestand dat de persoonlijke sleutel bevat. Zie Locatie en indeling van X.509-certificaten op Linux-knooppunten voor meer informatie.

    Er zijn twee manieren waarop u listenerinstellingen en beveiligingsreferenties kunt opgeven:

    1. Geef ze op met behulp van een configuratiepakket:

      Voeg een benoemde TransportSettings sectie toe aan het settings.xml-bestand.

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

      In dit geval ziet de createServiceInstanceListeners methode er als volgt uit:

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

      Als u een TransportSettings sectie toevoegt in het settings.xml bestand zonder voorvoegsel, FabricTransportListenerSettings worden standaard alle instellingen uit deze sectie geladen.

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

      In dit geval ziet de CreateServiceInstanceListeners methode er als volgt uit:

      protected List<ServiceInstanceListener> createServiceInstanceListeners() {
          ArrayList<ServiceInstanceListener> listeners = new ArrayList<>();
          listeners.add(new ServiceInstanceListener((context) -> {
              return new FabricTransportServiceRemotingListener(context,this);
          }));
          return listeners;
      }
      
  3. Wanneer u methoden aanroept voor een beveiligde service met behulp van de externe stack, in plaats van de microsoft.serviceFabric.services.remoting.client.ServiceProxyBase klasse te gebruiken om een serviceproxy te maken, gebruikt u microsoft.serviceFabric.services.remoting.client.FabricServiceProxyFactory.

    Als de clientcode wordt uitgevoerd als onderdeel van een service, kunt u laden FabricTransportSettings vanuit het settings.xml-bestand. Maak een Sectie TransportSettings die vergelijkbaar is met de servicecode, zoals eerder wordt weergegeven. Breng de volgende wijzigingen aan in de clientcode:

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