سؤال

أقوم بإنشاء تطبيق WCF حيث سأستخدم الشهادات لتشفير الاتصال بين العميل والخادم.في بيئة التطوير الخاصة بي، أرغب في استخدام شهادة اختبار/شهادة موقعة ذاتيًا قمت بإنشائها باستخدام makecert.(فقط الخادم سيكون لديه شهادة، ولن يكون لدى العميل).

لقد قمت بتثبيت الشهادة في مخزن الشهادات، وكل شيء يعمل بشكل جيد.على العميل، يتم حاليًا تعيين وضع التحقق من صحة الشهادة على "خطأ"، لأنني أعمل مع شهادة اختبار.

مشكلتي:

في ملف app.config الموجود على العميل، أحتاج إلى تحديد عنصر الهوية على النحو التالي:

<endpoint ... >
   <identity>
      <dns value="<Name-Of-Server-Computer>"/>
   </identity>
</endpoint>

إذا قمت بإزالة عنصر الهوية، أحصل على رسالة الخطأ التالية في العميل عندما أحاول الاتصال بالخادم:

فشل التحقق من الهوية للرسالة الصادرة.كانت هوية DNS المتوقعة لنقطة النهاية البعيدة هي "المضيف المحلي" لكن نقطة النهاية البعيدة قدمت مطالبة DNS "اسم الكمبيوتر الخادم".إذا كانت هذه نقطة نهاية بعيدة شرعية، فيمكنك حل المشكلة عن طريق تحديد هوية DNS بشكل صريح "اسم الخادم-الكمبيوتر" كخاصية هوية لـ EndpointAddress عند إنشاء وكيل القناة.

إذن هذه أسئلتي:

  • هل يتم التحقق من الهوية فقط عند استخدام شهادة اختبار/موقعة ذاتيًا؟عندما أقوم بنشر تطبيقي باستخدام شهادة حقيقية وموثوقة تم شراؤها من مرجع مصدق، هل سيتم إجراء التحقق من الهوية؟

  • هل هناك طريقة لتعطيل التحقق من الهوية؟أعلم أنه يمكنني إنشاء أداة التحقق من صحة الشهادة المخصصة الخاصة بي، ولكن لا يبدو أن هناك طريقة لتجاوز التحقق من الهوية باستخدامها.

هل كانت مفيدة؟

المحلول

يتم الفحص دائمًا - ويجب أن يكون كذلك.بشكل أساسي، سيتحقق WCF من إصدار الشهادة لاسم المجال (yourcompany.com) أو اسم الجهاز الذي توجد به خدمتك.هذا فحص أمني لن أقوم بتعطيله أبدًا!بخلاف ذلك، يمكن لأي شخص ينتحل خدمتك استخدام أي شهادة تم إصدارها لاسم نطاق/جهاز عشوائي والحصول على حركة المرور الخاصة بك - وليس ما تريده!

إذن ما تحتاج إلى التأكد منه هو أن شهادتك الحقيقية على خادم الإنتاج قد تم إصدارها بالفعل لاسم النطاق الذي سيكون خادم الإنتاج جزءًا منه، على سبيل المثال.إذا كان خادم الإنتاج الخاص بك سيكون موجودًا في "production.yourcompany.com"، فيجب إرسال الشهادة إلى هذا النطاق.

مارك

نصائح أخرى

الجواب على هذا السؤال موجود في رسالة الخطأ نفسها.على العميل يمكنك القيام بما يلي:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server");
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);

استبدل "الخادم" بكل ما هو متوقع.عادةً ما يكون هذا هو الاسم الشائع (CN) لشهادتك الموقعة ذاتيًا.لن يؤدي القيام بذلك إلى إفساد الأمان، بشرط أن تتحمل المسؤولية الكاملة للتأكد من أن الشهادة المقدمة صالحة، أي إنشاء أداة التحقق من صحة الشهادة المخصصة الخاصة بك وإجراء الفحوصات ذات الصلة هناك.

يجب ضبط وضع التحقق من صحة الشهادة على "لا شيء"، وليس "خطأ"...

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