سؤال

لقد قمت بإضافة ServiceReference إلى تطبيق وحدة تحكم C# الذي يستدعي خدمة ويب يتم عرضها من Oracle.

لقد قمت بإعداد كل شيء وهو يعمل مثل الخوخ عندما لا يستخدم SSL (http).أحاول إعداده باستخدام SSL الآن، وأواجه مشكلات عند إضافته إلى مراجع الخدمة (أو حتى مراجع الويب).على سبيل المثال، عنوان URL (https) الذي يتم عرض الخدمة عليه، لا يعرض أساليب الويب المناسبة عندما أحاول إضافته إلى Visual Studio.

تم إغلاق الاتصال الأساسي:حدث خطأ غير متوقع أثناء الإرسال.تم تلقي EOF غير متوقع أو 0 بايت من دفق النقل.تحتوي البيانات التعريفية على مرجع لا يمكن حله:'https://srs204.mywebsite.ca:7776/SomeDirectory/MyWebService?WSDL'

مأزق آخر أواجهه يتعلق بإدارة الشهادات ونشرها.لدي حوالي 1000 موقع عملاء خارجي سيحتاجون إلى استخدام هذه الأداة المساعدة الصغيرة وسيحتاجون إلى تثبيت الشهادة في مخزن الشهادات المناسب للاتصال بخدمة الويب.لست متأكدا من أفضل نهج للتعامل مع هذا.هل يجب أن يكونوا في المتجر الجذر؟

لقد أمضيت ساعات قليلة على الويب في البحث عن خيارات متنوعة ولكن لا يمكنني الحصول على إجابة جيدة وواضحة في أي مكان.

باختصار، لدي سؤالان هنا:

1) هل لدى أي شخص بعض الروابط الجيدة حول إعداد خدمات الويب في Visual Studio التي تستخدم SSL؟

2) كيف يمكنني تسجيل الشهادة؟في أي متجر يجب أن يكون موجودا؟هل يمكنني فقط استخدام شيء مثل CertMgr لتسجيله؟

يجب أن يكون هناك كتاب جيد/برنامج تعليمي/أي شيء يُظهر لي الممارسات الجيدة الشائعة حول إعداد شيء كهذا.يبدو أنني لا أستطيع العثور عليه!

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

المحلول

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

لذا.

كانت المشكلة الجذرية هي أن Visual Studio 2008 يستخدم افتراضيًا TLS لمصافحة SSL وكانت خدمة الويب المستندة إلى Oracle/Java والتي كنت أحاول الاتصال بها تستخدم SSL3.

عند استخدام "إضافة مرجع الخدمة..." في Visual Studio 2008، لديك لا توجد وسيلة لتحديد أن البروتوكول الأمني لمدير نقطة الخدمة يجب أن يكون SSL3.

إلا إذا.

يمكنك أخذ مستند WSDL ثابت و استخدم wsdl.exe لإنشاء فئة وكيل.

wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl

ثم يمكنك استخدام مترجم سي شارب لتحويل فئة الوكيل هذه إلى مكتبة (.dll) وإضافتها إلى "المراجع" لمشاريع .Net الخاصة بك.

csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs

في هذه المرحلة، تحتاج أيضًا إلى التأكد من تضمين System.Web.Services في "المراجع" الخاصة بك أيضًا.

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

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

حسنًا، لقد كنت أشعر بإعجاب كبير بنفسي لأن الاختبار كان رائعًا في صندوق التطوير الخاص بي.ثم قمت بالنشر في صندوق عميل آخر ولن يتم الاتصال مرة أخرى بسبب مشكلة في الأذونات/السلطة.كانت رائحتها مثل الشهادات بالنسبة لي (مهما كانت رائحتها).لحل هذه المشكلة، أنا يستخدم certmgr.exe لتسجيل الشهادة الخاصة بالموقع على الجذر الموثوق به على الجهاز المحلي.

certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root

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

آمل أن تساعد هذه الإجابة بعض الناس.شكرًا لـ Blowdart أيضًا على كل ما قدمته من مساعدة في هذا الأمر وتقديم بعض الأفكار.

نصائح أخرى

وهذا يبدو وكأنه خدمة ويب يستخدم شهادة موقعة ذاتيا. بصراحة هذا ليس هو النهج الأفضل.

وبافتراض أنك منظمة كبيرة وانها الداخلي يمكنك الإعداد الخاصة بالمرجع المصدق الموثوق بها، وهذا هو السهل خصوصا مع <لأ href = "http://www.microsoft.com/windowsserver2003/technologies/pki/default. mspx "يختلط =" noreferrer نوفولو "> الدليل النشط . من ذلك CA يمكن أن تطلب من الملقم الذي يستضيف خدمة أوراكل شهادة ويمكنك استخدام السياسة AD أن تثق الشهادة الجذر CA الداخلي الخاص بك عن طريق وضعها في الجذر الموثوق بها من مخزن الجهاز. وهذا من شأنه إزالة الحاجة إلى الثقة يدويا أو قبول الشهادة على خدمة الإنترنت.

وإذا كانت الأجهزة العميلة هي الخارجية ثم وأنت تسير لديك للحصول على الناس تعريض الخدمة إما شراء شهادة "حقيقية" من أحد المصدقة المعروفة مثل فيريساين، THAWTE، GeoTrust الخ أو كجزء من لديك تثبيت حزمة الشهادة العامة وتثبيته في السلطات شهادة الجذر الموثوق بها على مستوى الجهاز على كل آلة. هذا لديه مشاكل، على سبيل المثال لا توجد طريقة لإلغاء الشهادة، ولكن سيتم إزالة موجه.

وشكرا لهذه معلومات سرية كبيرة، وأخذت نظرة سريعة حول في الاشياء وكان لديك الكثير من الأفكار الجيدة مستمرة. وهنا قال لي قليلا لإضافة - أنا معرفة ويب ميثودز ولها نفس المشاكل خادم التطبيق أوراكل اتصالك إلى (SSL3 بدلا من TLS) (مفاجأة!). نهجكم عملت كبيرة، وهنا قال لي الإضافة.

ونظرا فئة ثابتة "مصنع" توفر هذه بندين مفيد، مدهش:

/// <summary>
/// Used when dispatching code from the Factory (for example, SSL3 calls)
/// </summary>
/// <param name="flag">Make this guy have values for debugging support</param>
public delegate void CodeDispatcher(ref string flag);

/// <summary>
/// Run code in SSL3 -- this is not thread safe. All connections executed while this
/// context is active are set with this flag. Need to research how to avoid this...
/// </summary>
/// <param name="flag">Debugging context on exception</param>
/// <param name="dispatcher">Dispatching code</param>
public static void DispatchInSsl3(ref string flag, CodeDispatcher dispatcher)
{
  var resetServicePoint = false;
  var origSecurityProtocol = System.Net.ServicePointManager.SecurityProtocol;
  try
  {
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
    resetServicePoint = true;
    dispatcher(ref flag);
  }
  finally
  {
    if (resetServicePoint)
    {
      try { System.Net.ServicePointManager.SecurityProtocol = origSecurityProtocol; }
      catch { }
    }
  }
}

وثم تستهلك هذه الاشياء (كما كان لديك أي شك خمنت بالفعل، ولكن وضع طبل لفة هنا على أي حال):

    var readings = new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading[] {
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 1, created = DateTime.Now.AddDays(-1), reading = 17.34, userID = 2
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 2, created = DateTime.Now.AddDays(-2), reading = 99.76, userID = 3
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 3, created = DateTime.Now.AddDays(-5), reading = 82.17, userID = 4
      }
    };
    ArchG2.Portal.Utils.wmArchG201.Factory.DispatchInSsl3(ref flag, (ref string flag_inner) =>
    {
      // creates the binding, endpoint, etc. programatically to avoid mucking with
      // SharePoint web.config.
      var wsFireWmdReading = ArchG2.Portal.Utils.wmArchG201.Factory.Get_fireWmdReading(ref flag_inner, LH, Context);
      wsFireWmdReading.fireWmdReading(readings);
    });

وهذا لا حيلة - عندما أحصل على مزيد من الوقت سوف حل القضية خيوط (أو لا)

ومنذ ليس لدي سمعة التعليق، أود أن أشير إلى أن الجواب ورمز عينة مات Nadrofsky لإجبار SSL3 هو أيضا حل لخطأ مشابهة

<اقتباس فقرة>   

حدث خطأ أثناء جعل   طلب HTTP إلى HTTPS: // XXXX / مهما .   وهذا يمكن أن يكون راجعا إلى حقيقة أن   لم يتم تكوين شهادة الخادم   صحيح مع HTTP.SYS في HTTPS   قضية. ويمكن أيضا أن يكون سبب هذا من قبل   عدم تطابق أمنية ملزمة   بين العميل والخادم.

ومجرد استخدام

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

وكما ذكر مات. اختبار مع خادم SAP نت ويفر PI في HTTPS. شكرا!

ومات،

وكان لي مثل هذه القضايا جدا وليس لدي وسيلة لتجنب استخدام certmgr.exe لإضافة الشهادات الجذر الموثوق بها على جهاز بعيد.

X509Store store;
store = new X509Store("ROOT", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

وو"الكائن شهادة" يمكن إنشاء مثل هذا:

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top