هل يدعم HttpListener SSL للمضيف المحلي فقط؟

برمجة


مرحبًا،

أعتقد أن الكثير من الناس يعرفون ويستخدمون http.HttpListener[^] فصل.

بقدر ما أستطيع أن أرى من الملاحظة على MSDN أنها تدعم حركة مرور https:

If you create an HttpListener using https, you must select a Server Certificate for that listener. Otherwise, an HttpWebRequest query of this HttpListener will fail with an unexpected close of the connection.

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

ROOT
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=Root,O=DO_NOT_TRUST,OU=test purposes" -sky signature -pe -r "Root.cer" -sv "RootKey.pvk"

Personal
makecert.exe -sr localmachine -ss MY -a sha1 -n "CN=*.codeproject.com,O=DO_NOT_TRUST,OU=test purposes" -sky exchange -pe -ir localmachine  -iv "RootKey.pvk" -ic "Root.cer"

لقد قمت بربط الشهادة بالمنفذ مثل هذا:

netsh http add sslcert ipport=0.0.0.0:8081 certhash="{hash}" appid={guid}

وكل شيء يعمل ولكن فقط للمواقع الموجودة على المضيف المحلي. عندما أحاول فتح https://codeproject.com على سبيل المثال. طلب HttpListener “لا يسمع”. يحاول المتصفح فتح صفحة ويب ويفشل مع انتهاء المهلة.

راجع للشغل، أعلم أنه يسمى هجوم الرجل في الوسط ولكنه مخصص لأغراض الاختبار فقط ولسوء الحظ لا يمكنني استخدام Fiddler الذي يستخدم هذه التقنية أيضًا.

حسب التقليد، سؤالي ليس بسيطًا، وأعتقد أنه لا يوجد هنا “تقييم مجاني” يا شباب، آسف 🙂 ولكن إذا كنت قادرًا على مساعدتي فسيكون ذلك رائعًا.

ملاحظة أخرى – لقد قرأت جميع المقالات تقريبًا حول هذا الموضوع وجميع الأمثلة على المضيف المحلي هناك. لذا، إذا كنت ستزودني برابط لمقالة، فيرجى التحقق من أنه قد يكون هذا المثال أيضًا للمضيف المحلي؛)

وواحد آخر – قد يكون اقتراحك هو استخدام TcpListner أو شيء من هذا القبيل. في الوقت الحالي لا أريد تغيير المنطق، سأغير المنطق إذا كان الحل الوحيد.

شكرًا جزيلاً. تيمور.

الحل 1

مدهش! أكثر من 50 مشاهدة ولا إجابات كالعادة 🙂 أجيب بنفسي كالعادة.

يعد HttpListener فئة عالية المستوى أكثر من TCPListener. بالطبع هذا يعني أنه من الأسهل العمل مع HttpListener ولكن! وهذا يعني أيضًا أن هناك نقصًا في الوظائف. أعني أنه لا يمكنك إنشاء وكيل جدي باستخدام HTTPListener.

كما نعلم للعمل مع مأخذ التوصيل الآمن (SSL)، نحتاج إلى إجراء مصافحة SSL (طريقة CONNECT وما إلى ذلك). لكن بالنسبة لـ HttpListener، يجب أن يتم ذلك عبر ربط الشهادة (netsh http add sslcert). كل ما يمكنني قوله هو أنني جربت كل شيء ولم أتمكن من العمل مع المضيف البعيد، فقط مع المضيف المحلي. لا أعرف السبب، آسف.
بعد ذلك، فإن عرض الشهادة هذا ليس مريحًا للاستخدام من حيث الوكيل. ماذا لو كنت أرغب في إنشاء شهادات سريعة بموضوع CN الصحيح؟

كل هذا دفعني إلى إعادة كتابة طلبي لاستخدام TCPListener والتعامل مع أساليب CONNECT.

المقالة التالية تساعدني على فهم الأساسيات:
تنفيذ خادم وكيل HTTP/HTTPS متعدد مؤشرات الترابط في C#[^]

الحل 6

لم يفت الاوان للإجابة؟

يلزم حجز عنوان URL عند محاولة استخدام HttpListener لأي شيء آخر غير المضيف المحلي. بناء الجملة لهذا هو كما يلي:

netsh http add urlacl url=http://<hostName>:<port>/ user=<user>

حيث <اسم المضيف>: <المنفذ> هو نقطة النهاية لـ HttpListener الخاص بك، و هو معرف المستخدم أو اسم مجموعة المستخدم الذي سيتم تسجيل حجز عنوان URL بموجبه.

احذف الحجز بالصيغة التالية:

netsh http delete urlacl url=http://<hostName>:<port>/

コメント

タイトルとURLをコピーしました