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:
Maak een interface,
HelloWorldStateless
, die de methoden definieert die beschikbaar zijn voor een externe procedureaanroep in uw service. Uw service gebruiktFabricTransportServiceRemotingListener
, die is gedeclareerd in hetmicrosoft.serviceFabric.services.remoting.fabricTransport.runtime
pakket. Dit is eenCommunicationListener
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!"); } }
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:
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; }
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 umicrosoft.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();