Delen via


Communicatie via externe communicatie van beveiligde services in een Java-service

Beveiliging is een van de belangrijkste aspecten van communicatie. Het Reliable Services-toepassingsframework biedt enkele vooraf gebouwde 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 kunt instellen voor betrouwbare services die zijn geschreven in Java.

Voer de volgende stappen uit om een service te beveiligen wanneer u externe communicatie met Java-services gebruikt:

  1. Maak een interface, HelloWorldStateless, die de methoden definieert die beschikbaar zijn voor een externe procedureaanroep in uw service. Uw service gebruikt FabricTransportServiceRemotingListener, die is gedeclareerd in het microsoft.serviceFabric.services.remoting.fabricTransport.runtime pakket. Dit is een CommunicationListener implementatie die externe communicatiemogelijkheden 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. Listenerinstellingen en beveiligingsreferenties toevoegen.

    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 op Linux worden uitgevoerd, moet het certificaat beschikbaar zijn als een PEM-formuliergematteerd bestand; een .pem bestand met het certificaat en de persoonlijke sleutel of een .crt bestand met het certificaat en een .key bestand met de persoonlijke sleutel. Zie Locatie en indeling van X.509-certificaten op Linux-knooppunten voor meer informatie.

    Er zijn twee manieren waarop u listener-instellingen 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 aan 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 op een beveiligde service aanroept 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 is 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();