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