Безопасное удаленное взаимодействие со службой для службы Java
Безопасность — один из самых важных аспектов взаимодействия. Платформа приложений Reliable Services предоставляет несколько готовых стеков взаимодействия и средств, которыми можно воспользоваться для повышения безопасности. В этой статье объясняется, как повысить безопасность при использовании удаленного взаимодействия со службой для службы Java. Мы будем использовать существующий пример, в котором описывается настройка удаленного взаимодействия для Reliable Services, написанных на Java.
Для защиты службы при использовании удаленного взаимодействия со службами Java выполните следующие действия:
Создайте интерфейс
HelloWorldStateless
, определяющий методы, которые будут доступны для удаленного вызова процедур в службе. Служба также будет использовать прослушивательFabricTransportServiceRemotingListener
, который объявляется в пакетеmicrosoft.serviceFabric.services.remoting.fabricTransport.runtime
. Это реализацияCommunicationListener
, которая предоставляет возможности удаленного взаимодействия.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!"); } }
Добавьте параметры прослушивателя и учетные данные безопасности.
Убедитесь, что сертификат, который вы хотите использовать для защиты взаимодействия со службой, установлен на всех узлах в кластере. Для служб, выполняемых на Linux, сертификат должен находиться в PEM-файле. Это может быть файл
.pem
с сертификатом и закрытым ключом или файл.crt
с сертификатом и файл.key
с закрытым ключом. Дополнительные сведения см. в разделе Расположение и формат сертификатов X.509 в узлах Linux.Существует два способа указания параметров прослушивателя и учетных данных безопасности:
Предоставьте их с помощью пакета конфигурации:
Добавьте именованный раздел
TransportSettings
в файл 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>
В этом случае метод
createServiceInstanceListeners
будет выглядеть следующим образом:protected List<ServiceInstanceListener> createServiceInstanceListeners() { ArrayList<ServiceInstanceListener> listeners = new ArrayList<>(); listeners.add(new ServiceInstanceListener((context) -> { return new FabricTransportServiceRemotingListener(context,this, FabricTransportRemotingListenerSettings.loadFrom(HelloWorldStatelessTransportSettings)); })); return listeners; }
При добавлении раздела
TransportSettings
в файл settings.xml без префиксаFabricTransportListenerSettings
по умолчанию загрузит все параметры из этого раздела.<!--"TransportSettings" section without any prefix.--> <Section Name="TransportSettings"> ... </Section>
В этом случае метод
CreateServiceInstanceListeners
будет выглядеть следующим образом:protected List<ServiceInstanceListener> createServiceInstanceListeners() { ArrayList<ServiceInstanceListener> listeners = new ArrayList<>(); listeners.add(new ServiceInstanceListener((context) -> { return new FabricTransportServiceRemotingListener(context,this); })); return listeners; }
При вызове методов для защищенной службы с помощью стека удаленного взаимодействия вместо использования класса
microsoft.serviceFabric.services.remoting.client.ServiceProxyBase
для создания прокси-службы используйтеmicrosoft.serviceFabric.services.remoting.client.FabricServiceProxyFactory
.Если клиентский код выполняется как часть службы, можно загрузить
FabricTransportSettings
из файла settings.xml. Создайте раздел TransportSettings по аналогии с кодом службы, как показано выше. Внесите следующие изменения в клиентский код: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();