Bezpieczna komunikacja zdalna usługi w usłudze Java
Bezpieczeństwo jest jednym z najważniejszych aspektów komunikacji. Struktura aplikacji Reliable Services udostępnia kilka wstępnie utworzonych stosów komunikacyjnych i narzędzi, których można użyć do poprawy bezpieczeństwa. W tym artykule omówiono sposób poprawiania zabezpieczeń podczas korzystania z komunikacji zdalnie usługi w usłudze Java. Opiera się on na istniejącym przykładzie , w ramach którego wyjaśniono, jak skonfigurować komunikacja zdalną dla niezawodnych usług napisanych w języku Java.
Aby ułatwić zabezpieczanie usługi podczas korzystania z komunikacji zdalnie usługi z usługami Java, wykonaj następujące kroki:
Utwórz interfejs ,
HelloWorldStateless
który definiuje metody, które będą dostępne dla zdalnego wywołania procedury w usłudze. Usługa będzie używaćFabricTransportServiceRemotingListener
elementu , który jest zadeklarowany w pakieciemicrosoft.serviceFabric.services.remoting.fabricTransport.runtime
. Jest to implementacjaCommunicationListener
, która zapewnia możliwości komunikacji zdalniej.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!"); } }
Dodaj ustawienia odbiornika i poświadczenia zabezpieczeń.
Upewnij się, że certyfikat, którego chcesz użyć, aby ułatwić zabezpieczenie komunikacji z usługą, jest zainstalowany na wszystkich węzłach w klastrze. W przypadku usług działających w systemie Linux certyfikat musi być dostępny jako plik PEM-formmatted;
.pem
plik zawierający certyfikat i klucz prywatny lub.crt
plik zawierający certyfikat i.key
plik zawierający klucz prywatny. Aby dowiedzieć się więcej, zobacz Lokalizacja i format certyfikatów X.509 w węzłach systemu Linux.Istnieją dwa sposoby udostępniania ustawień odbiornika i poświadczeń zabezpieczeń:
Podaj je przy użyciu pakietu konfiguracji:
Dodaj nazwaną
TransportSettings
sekcję w pliku 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>
W takim przypadku
createServiceInstanceListeners
metoda będzie wyglądać następująco:protected List<ServiceInstanceListener> createServiceInstanceListeners() { ArrayList<ServiceInstanceListener> listeners = new ArrayList<>(); listeners.add(new ServiceInstanceListener((context) -> { return new FabricTransportServiceRemotingListener(context,this, FabricTransportRemotingListenerSettings.loadFrom(HelloWorldStatelessTransportSettings)); })); return listeners; }
Jeśli dodasz sekcję
TransportSettings
w pliku settings.xml bez żadnego prefiksu,FabricTransportListenerSettings
wszystkie ustawienia z tej sekcji zostaną domyślnie załadowane.<!--"TransportSettings" section without any prefix.--> <Section Name="TransportSettings"> ... </Section>
W takim przypadku
CreateServiceInstanceListeners
metoda będzie wyglądać następująco:protected List<ServiceInstanceListener> createServiceInstanceListeners() { ArrayList<ServiceInstanceListener> listeners = new ArrayList<>(); listeners.add(new ServiceInstanceListener((context) -> { return new FabricTransportServiceRemotingListener(context,this); })); return listeners; }
W przypadku wywoływania metod w zabezpieczonej usłudze przy użyciu stosu komunikacji telefonicznej zamiast używania
microsoft.serviceFabric.services.remoting.client.ServiceProxyBase
klasy do utworzenia serwera proxy usługi użyj poleceniamicrosoft.serviceFabric.services.remoting.client.FabricServiceProxyFactory
.Jeśli kod klienta jest uruchomiony w ramach usługi, możesz załadować
FabricTransportSettings
go z pliku settings.xml. Utwórz sekcję TransportSettings podobną do kodu usługi, jak pokazano wcześniej. Wprowadź następujące zmiany w kodzie klienta: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();