مشاركة عبر


تأمين اتصالات الخدمة عن بُعد في خدمة Java

الأمان هو أحد أهم جوانب الاتصال. يوفر إطار عمل تطبيق الخدمات الموثوقة عدداً قليلاً من مكدسات وأدوات الاتصال المنشأة مسبقاً والتي يمكنك استخدامها لتحسين الأمان. تتناول هذه المقالة كيفية تحسين الأمان عند استخدام خدمة الاتصال عن بُعد في خدمة Java. يعتمد على مثال موجود يشرح كيفية إعداد الاتصال عن بُعد لخدمات موثوقة مكتوبة بلغة Java.

للمساعدة في تأمين خدمة عند استخدام خدمة الاتصال عن بُعد مع خدمات Java، اتبع الخطوات التالية:

  1. قم بإنشاء واجهة 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!");
        }
    }
    
  2. أضف إعدادات المُستمع وبيانات اعتماد الأمان.

    تأكد من تثبيت الشهادة التي تريد استخدامها للمساعدة في تأمين اتصال الخدمة الخاص بك على جميع العقد في نظام المجموعة. بالنسبة للخدمات التي تعمل على Linux، يجب أن تكون الشهادة متاحة كملف بتنسيق PEM؛ إما .pemملف يحتوي على الشهادة والمفتاح الخاص أو .crtملف يحتوي على الشهادة و .keyملف يحتوي على المفتاح الخاص. لمعرفة المزيد، راجع موقع شهادات X.509 وتنسيقها على عقد Linux.

    هناك طريقتان يمكنك من خلالهما توفير إعدادات المستمع وبيانات اعتماد الأمان:

    1. وفرها باستخدام حزمة تكوين:

      إضافة قسم باسم 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;
      }
      
  3. عند استدعاء طرق على خدمة مؤمنة باستخدام مكدس الاتصال عن بُعد، بدلًا من استخدام 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();