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:
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änderFabricTransportServiceRemotingListener
, som deklareras imicrosoft.serviceFabric.services.remoting.fabricTransport.runtime
paketet. Det här är enCommunicationListener
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!"); } }
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:
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 prefixFabricTransportListenerSettings
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; }
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.FabricServiceProxyFactory
du i stället för att användamicrosoft.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();