كيفية تكوين خدمة WCF لقبول عميل واحد فقط تم تحديده بواسطة شهادة X509

StackOverflow https://stackoverflow.com/questions/2276594

سؤال

لديّ تطبيق عميل/خدمة WCF يعتمد على التواصل الآمن بين جهازين وأريد استخدام شهادات X509 المثبتة في متجر الشهادة لتحديد الخادم والعميل لبعضهما البعض. أفعل هذا من خلال تكوين الربط كما <security authenticationMode="MutualCertificate"/>. لا يوجد سوى جهاز عميل.

يحتوي الخادم على شهادة صادرة إلى server.mydomain.com مثبتة في الكمبيوتر/المتجر الشخصي المحلي ولديه العميل شهادة صادرة إلى client.mydomain.com مثبتة في نفس المكان. بالإضافة إلى ذلك ، يحتوي الخادم على شهادة العميل العامة في الكمبيوتر المحلي/الأشخاص الموثوق بهم ولديه العميل الشهادة العامة للخادم في الكمبيوتر المحلي/الموثوق بهم.

أخيرًا ، تم تكوين العميل للتحقق من شهادة الخادم. فعلت هذا باستخدام system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate عنصر في ملف التكوين.

حتى الآن جيد جدًا ، كل هذا يعمل. مشكلتي هي أنني أريد تحديد في ملف تكوين الخادم أن العملاء الذين يحددون أنفسهم فقط مع شهادة client.mydomain.com من متجر شهادة الأشخاص الموثوق بهم يُسمح للاتصال.

المعلومات الصحيحة متوفرة على الخادم باستخدام ServiceSecurityContext, ، لكنني أبحث عن طريقة لتحديدها في app.config بأنه يجب على WCF القيام بهذا الشيك بدلاً من الاضطرار إلى التحقق من سياق الأمان من الكود.

هل هذا ممكن؟ أي تلميحات سيكون موضع تقدير.

بالمناسبة ، يبدو ملف تكوين الخادم الخاص بي مثل هذا حتى الآن:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="MyServer.Server" behaviorConfiguration="CertificateBehavior">
        <endpoint contract="Contracts.IMyService" binding="customBinding" bindingConfiguration="SecureConfig">
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/SecureWcf"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CertificateBehavior">
          <serviceCredentials>
            <serviceCertificate storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="server.mydomain.com"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <customBinding>
        <binding name="SecureConfig">
          <security authenticationMode="MutualCertificate"/>
          <httpTransport/>
        </binding>
      </customBinding>
    </bindings>
  </system.serviceModel>
</configuration>
هل كانت مفيدة؟

المحلول

لا يبدو أن هناك طريقة للقيام بما أريد باستخدام web.config.

انتهى بي الأمر بإضافة سلوك بهذه العلامة:

<clientCertificate>
  <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/>
</clientCertificate>

ثم أضف شهادة العميل إلى متجر شهادة "الأشخاص الموثوق بهم" للمستخدم الذي يعمل عليه الخادم.

نصائح أخرى

تفحص ال إرشادات الأمن WCF صفحة على codeplex - أشياء ممتازة ومفيدة للغاية!

على وجه الخصوص ، تحقق من الإرشاد والتحديد

كيفية - استخدام مصادقة الشهادة وأمن الرسائل في WCF Calling من Windows Forms

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

أتمنى أن يساعدك هذا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top