تأمين اتصالات الخدمة عن بُعد في خدمة Java
الأمان هو أحد أهم جوانب الاتصال. يوفر إطار عمل تطبيق الخدمات الموثوقة عدداً قليلاً من مكدسات وأدوات الاتصال المنشأة مسبقاً والتي يمكنك استخدامها لتحسين الأمان. تتناول هذه المقالة كيفية تحسين الأمان عند استخدام خدمة الاتصال عن بُعد في خدمة Java. يعتمد على مثال موجود يشرح كيفية إعداد الاتصال عن بُعد لخدمات موثوقة مكتوبة بلغة 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
من ملف إعدادات.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();