HTTPS من دون مشقة باستخدام كادي (Caddy)

Mohammed Al-Sahaf

هل لاحظت وجود قفل بجانب عنوان الموقع؟ قد يكون أخضر اللون. يدل هذا على أن الموقع تم توفيره على HTTPS، وهو بروتوكول يضمن لمتصفح الموقع خصوصيته عن طريق حجب محتويات الصفحة عن المترصدين ومنع أي وسيط بالشبكة من العبث بالمحتويات أثناء مرورها عبر شبكات الانترنت. يستخدم بروتوكول HTTPS شهادة رقمية معتمدة على التشفير الغير متناظر (asymmetric cryptography) باستخدام زوج من المفاتيح أحدهما عام معلن والآخر خاص.

لن أزعجكم بالتاريخ والتفاصيل التقنية لكيفية عمل البروتوكول خلف الكواليس، ولكن سأشرح كيف يمكنك توفير HTTPS لموقعك والبنية التحتية التقنية لمؤسستك. هنالك عدة طرق للحصول على شهادة TLS رقمية:

١ يدويا

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

٢ بروتوكول أكمي (ACME)

في عام ٢٠١٥ أطلقت منظمة Let’s Encrypt أول هيئة شهادة معتمدة آلية تسعى لأتمتة إصدار واستلام شهادات TLS. تم إنشاء المنظمة بتعاون بين عدة منظمات تقنية كبرى من ضمنها موزيلا وسيسكو. صممت المنظمة بروتوكول ACME والذي يرمز لـ Automated Certificate Management Environment، وتم في عام ٢٠١٩ اعتماد بروتوكول ACME كـ RFC 8555 لدى IETF: Internet Engineering Task Force. في تلك الأثناء (٢٠١٥) كان هناك خادم ويب اسمه Caddy يطوره مات هولت (Matt Holt) لتوفير HTTPS بشكل افتراضي لتكون الخدمة الغير مشفرة هي الاستثناء، وعندما تم إطلاق نسخة بيتا الأولى لـ Let’s Encrypt في عام ٢٠١٥ كان كادي أول عميل آلي يتسلم شهادة عند تشغيله مباشرة من Let’s Encrypt ويتم تجديدها تلقائيا قبل انتهاء صلاحيتها، وبذلك يكون كادي أول خادم ويب يدير شهادات TLS الخاصة به تلقائيا من لحظة الصفر ومن دون الحاجة إلى أدوات خارجية.

لماذا كادي؟

تم كتابة كادي باستخدام لغة Go، والتي تضمن أمان الذاكرة Memory Safety بعكس الخوادم الأخرى المكتوبة بلغة C، وبالتالي لن يكون كادي عرضة لأخطاء تجاوز سعة المخزن المؤقت (Buffer Overflow) أو الأخطاء الأخرى المرتبطة بإدارة موارد الذاكرة يدويا. كما يدعم كادي أحدث بروتوكولات TLS بشكل تلقائي مع كل تحديث (الاصدار 1.2 بحد أدنى والإصدار الأحدث – عند تاريخ كتابة هذا المقال – 1.3 كحد أقصى) بالإضافة إلى كون كادي الخادم الوحيد الذي يرفق تدبيس بروتوكول حالة الشهادة عبر الإنترنت (OCSP) بشكل تلقائي وصحيح، وبإمكان كادي استبدال الشهادة تلقائيا في حال تم إلغاء الشهادة لأي سبب من قبل الهيئة المصدرة للشهادة، كما يدعم كادي بروتوكول HTTP/3 التجريبي، والمزيد غير ذلك.

لنبدأ

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

يجب أولا تثبيت عدة حزم متطلبة لإعطاء apt القدرة على استخدام HTTPS والقدرة على إضافة مفاتيح عامة لحزم من مصادر غير المخزن الرسمي لدبيان.

1
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https

يمكننا الآن إضافة المفاتيح العامة الخاصة بالمخزن الخاص بكادي ومن ثم تثبيت كادي

1
2
3
4
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

بإمكانك الآن زيارة http://localhost على متصفح الانترنت وسترى ورقة مائلة تخبرك بأن كادي تم تثبيته بنجاح.

ضبط كادي

لغة كادي الرسمية للاعدادات هي JSON، ولكن يوجد عدة مترجمات للعديد من الصيغ الأخرى (YAML، NGINX، الخ) إلى JSON وأشهرها هي صيغة Caddyfile. عندما يتم تثبيت كادي باستخدام مدير الحزم، فإنه يتم تثبيت وحدة systemd مع إعدادات لتشغيل كادي بملف ضبط بصيغة Caddyfile يقع في:

/etc/caddy/Caddyfile

محتواه الافتراضي هو

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
:80 {
    # Set this path to your site's directory.
    root * /usr/share/caddy

    # Enable the static file server.
    file_server

    # Another common task is to set up a reverse proxy:
    # reverse_proxy localhost:8080

    # Or serve a PHP site through php-fpm:
    # php_fastcgi localhost:9000
}

كل ما هنالك هو ضبط كادي للاستماع على منفذ Port 80 وضبط خادم ملفات متجذر عند المجلد:

/usr/share/caddy

أما الأسطر التي تبدأ بعلامة # فهي تعليقات للقارئ البشري، ويتم تجاهلها من قبل البرنامج. المهم الآن هو التأكد من أن كادي يعمل بشكل صحيح. قم بزيارة http://localhost في متصفحك المفضل. الصفحة المميزة لكادي بوضعه الافتراضي بعد التثبيت هي الورقة المائلة.

سحر كادي

افتح ملف اعدادات كادي:

/etc/caddy/Caddyfile

ثم قم بتبديل محتواه إلى:

1
2
3
4
5
6
7
localhost {
    # Set this path to your site's directory.
    root * /usr/share/caddy

    # Enable the static file server.
    file_server
}

قد لا تبدو التغيرات جلية ولكن تم حذف التعليقات وتغيير :80 إلى localhost. افتح shell واكتب الأمر التالي لإعطاء كادي إشارة لإعادة قراءة الإعدادات:

sudo systemctl reload caddy

ثم قم بزيارة https://localhost في متصفحك المفضل. سترى نفس الصفحة السابقة ولكن مع وجود علامة القفل بجانب عنوان الصفحة. ما حدث للتو هو أن كادي أصدر شهادة TLS تلقائيا عند ضبطك اسم نطاق في ملف الإعدادات ليكون الوضع الافتراضي دائما هو الوضع الآمن وليس العكس كما كان سابقا.

موقعك الخاص

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

/var/www

المملوك للمستخدم www-data. عند تثبيت كادي باستخدام apt، يتم إنشاء مستخدم اسمه caddy ليتم تشغيل الخادم ضمن نطاق المستخدم الجديد المحدودة، ويتم أيضا إضافة المستخدم إلى مجموعة المستخدمين المسماة www-data ليحصل كادي على ذات الصلاحيات المعطاة للخوادم الآخرين على نفس الجهاز. بالتالي يمكنك رفع ملفات موقعك إلى ذات المجلد المذكور سابقا ومن ثم تغيير إعدادات كادي إلى التالي بعد استبدال www.example.com بنطاقك الخاص:

1
2
3
4
www.example.com {
    root * /var/www
    file_server
}

ثم نفذ الأمر التالي لتحديث إعدادات كادي بالمحتويات الجديدة
1
sudo systemctl reload caddy

عند تنفيذ الأمر، سيتحقق كادي من تواجد شهادة للنطاق، فإن لم يجدها فسيقوم بطلب شهادة من Let's Encrypt أو ZeroSSL تلقائيا.

وأخيرا، يمكنك النوم قرير العين والاطمئنان بأن شهادة TLS حديثة ويتم تجديدها تلقائيا في أي وقت.

خالص الشكر للصديق علي الحاجي لمراجعة التدوينة لغويا