
Ruby In The Middle (وكيل اعتراض HTTP/HTTPS)
Ruby in the middle (RITM) هو وكيل اعتراض HTTP/HTTPS مع إنشاء وتوقيع الشهادات في الوقت الفعلي، مما يمنح المستخدم القوة الكاملة للغة Ruby لاعتراض وحتى تعديل الطلبات والاستجابات كما يشاء.
gem install ritm
require 'ritm'
# إجابة واحدة لجميع عمليات بحث Google
Ritm.on_request do |req|
if req.request_uri.host.start_with? 'www.google.'
new_query_string = req.request_uri.query.gsub(/(?<=^q=|&q=)(((?!&|$).)*)(?=&|$)/, 'RubyInTheMiddle')
req.request_uri.query = new_query_string
end
end
my_picture = File.read('i_am_famous.jpg')
# يستبدل كل صورة على الويب بوجهي الجميل
Ritm.on_response do |_req, res|
if res.header['content-type'] && res.header['content-type'].start_with?('image/')
res.header['content-type'] = 'image/jpeg'
res.body = my_picture
end
end
Ritm.start
puts 'اضغط على Enter للانتهاء'
gets
Ritm.shutdown
أو أي عميل HTTP تريد اعتراض حركة المرور منه، للاتصال بالوكيل على localhost:8080
بالنسبة للأمثلة أعلاه، ابحث عن أي شيء في Google وقم أيضًا بزيارة موقع صحيفتك المفضل.
مع المثال السابق، قد يواجه عميلك مشكلات عند محاولة الوصول إلى موارد HTTPS. في بعض الحالات يمكنك إضافة استثناء لمتصفحك (أو توجيه عميل HTTP الخاص بك بعدم التحقق من الشهادات) ولكن في بعض الحالات الأخرى لن تتمكن من إضافة استثناءات. السبب في ذلك هو أنه من أجل فك تشفير حركة مرور SSL والقدرة على تعديلها، يجب أن يكون RITM هو من يقوم بمفاوضات SSL مع العميل (باستخدام مجموعته الخاصة من الشهادات) ثم يقوم بإنشاء جلسة SSL منفصلة تجاه الخادم. أي:
Client <--- SSL session ---> RITM <--- SSL session ---> Server
لكل اسم مضيف خادم مختلف يحاول عميلك التواصل معه، سيقوم RITM بإنشاء شهادة في الوقت الفعلي وتوقيعها باستخدام هيئة شهادات (CA) مهيأة مسبقًا. لذلك، لتتمكن من إنشاء اتصال آمن، ستحتاج إلى تكوين عميلك (مثل المتصفح) للثقة في شهادة CA الخاصة بـ RITM.
لأسباب أمنية، في كل مرة تقوم فيها بتشغيل وكيل RITM بالإعدادات الافتراضية، سيتم إنشاء هيئة شهادات داخلية جديدة. لاستخدام CA الخاصة بك بدلاً من ذلك (حتى يمكن تحميلها والثقة بها بواسطة متصفحك) قم بتنفيذ الخطوات التالية:
يمكنك استخدام OpenSSL أو RITM لإنشاء هذين الملفين. باستخدام OpenSSL:
openssl req -new -nodes -x509 -days 365 -extensions v3_ca -keyout insecure_ca.key -out insecure_ca.crt
أو باستخدام RITM:
require 'ritm/certs/ca'
ca = Ritm::CA.create common_name: 'InsecureCA'
File.write('insecure_ca.crt', ca.pem)
File.write('insecure_ca.key', ca.private_key.to_s)
Ritm.configure do
ssl_reverse_proxy.ca[:pem] = 'path/to/insecure_ca.crt'
ssl_reverse_proxy.ca[:key] = 'path/to/insecure_ca.key'
end
Ritm.start
puts 'اضغط على Enter للانتهاء'
gets
Ritm.shutdown
سأترك لك اكتشاف كيفية القيام بذلك في متصفحك أو عميلك. 4. تصفح الويب!
أو احتفظ بالمفتاح الخاص لـ CA بعناية فائقة لأن أي شخص يمتلك هذا المفتاح سيكون قادرًا على فك تشفير كل حركة المرور الخاصة بك! لاحظ أيضًا أنه عند استخدام الوكيل، سيتم تلقائيًا الثقة بكل خادم حتى لو لم تكن شهادة الخادم النهائي صالحة.
في الأمثلة أعلاه كنا نستخدم الجلسة العامة الافتراضية. إذا كنت لا ترغب في استخدام جلسة عامة مهيأة بشكل ثابت، أو كنت ترغب في وجود جلسات متعددة متعايشة (مثل وكلاء متعددين يستمعون على منافذ مختلفة ويستخدمون معالجات اعتراض مختلفة) يمكنك إنشاء مثيلات جلسة مختلفة بهذه الطريقة:
session = Ritm::Session.new
# يمكنك الآن استخدام نفس الطرق ولكن على مثيل الجلسة
session.configure { proxy[:bind_port] = 7777 }
session.on_request { |req| ...قم بفعل شيء هنا ... }
another_session = Ritm::Session.new
another_session.configure { proxy[:bind_port] = 8888 }
another_session.on_request { |req| ...قم بفعل شيء آخر ... }
session.start
another_session.start
puts 'اضغط على Enter للانتهاء'
gets
session.shutdown
another_session.shutdown
مرخص بموجب رخصة Apache، الإصدار 2.0 ("الترخيص")؛ لا يجوز لك استخدام هذا الملف إلا وفقًا للترخيص. يمكنك الحصول على نسخة من الترخيص على
http://www.apache.org/licenses/LICENSE-2.0
ما لم ينص القانون المعمول به أو يتم الاتفاق عليه كتابيًا، يتم توزيع البرنامج المرخص بموجب الترخيص على أساس "كما هو"، دون أي ضمانات أو شروط من أي نوع، صريحة أو ضمنية. راجع الترخيص للحصول على الأذونات والقيود المحددة التي تحكم استخدام البرنامج.