كيفية إعداد Signed HTTP Exchanges (SXG) باستخدام nginx

كيفية إنشاء شهادة بروتوكول أمان طبقة النقل (TLS) باستخدام إضافات SXG وتثبيت أدوات لإنشاء ملفات SXG وضبط nginx لعرض ملفات SXG

Hiroki Kumazaki
Hiroki Kumazaki

عمليات تبادل HTTP الموقَّعة (SXG) هي تقنية ويب جديدة تسهّل على المستخدمين التمييز بين صنّاع المحتوى وموزّعي المحتوى. يوضّح لك هذا الدليل كيفية إعداد SXG.

التوافق مع جميع المتصفّحات

تتوفّر تقنية SXG في العديد من المتصفّحات المستندة إلى Chromium، بما في ذلك Google Chrome وSamsung Internet وMicrosoft Edge. راجِع قسم "التوافق والمعايير" في مقالة عمليات تبادل HTTP الموقَّعة من المصدر للاطّلاع على مزيد من المعلومات الحديثة.

المتطلبات الأساسية

لتنفيذ آلية SXG على موقعك الإلكتروني، عليك إجراء ما يلي:

  • التحكّم في نطاقك، بما في ذلك إدخالات نظام أسماء النطاقات
  • الحصول على الشهادات تتطلّب تقنية SXG إصدار شهادة مخصّصة. على وجه التحديد، لا يمكنك إعادة استخدام مفتاح أو شهادة بروتوكول أمان طبقة النقل (TLS).
  • توفُّر خادم HTTP يمكنه إنشاء ملفات SXG وعرضها عبر HTTPS

الفرضيّات

يفترض هذا الدليل أنّك:

  • أن تتوفّر لديك بيئة OpenSSL 1.1.1 تم إعداد هذا الدليل باستخدام الإصدار 18.04 LTS من نظام التشغيل Ubuntu على amd64 ISA.
  • أن يكون بإمكانك تشغيل sudo لتثبيت ملفات التشغيل
  • استخدِم nginx لخادم HTTP.
  • تستخدم DigiCert لإنشاء الشهادات التي تتضمّن إضافات ذات صلة بتنسيق SXG، لأنّه يبدو حاليًا أنّه الموفّر الوحيد الذي يتيح هذه الإضافات.

بالإضافة إلى ذلك، تفترض أمثلة الأوامر الواردة في هذه المقالة أنّ نطاقك هو website.test، لذا عليك استبدال website.test بنطاقك الفعلي.

الخطوة 1: الحصول على شهادة SXG

لإنشاء ملفات SXG، تحتاج إلى شهادة بروتوكول أمان طبقة النقل (TLS) مع إضافة CanSignHttpExchanges، بالإضافة إلى نوع مفتاح معيّن. توفّر DigiCert شهادات تتضمّن هذه الإضافة. تحتاج إلى ملف CSR لإصدار شهادة، لذا أنشئ هذا الملف باستخدام الأوامر التالية:

openssl ecparam -genkey -name prime256v1 -out mySxg.key
openssl req -new -key mySxg.key -nodes -out mySxg.csr -subj "/O=Test/C=US/CN=website.test"

سيظهر لك ملف CSR بالشكل التالي:

-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----

تأكَّد مما يلي:

  • لا تتجاوز مدة الصلاحية 90 يومًا.
  • تم تفعيل مربّع الاختيار تضمين إضافة CanSignHttpExchanges في الشهادة، الذي يمكن العثور عليه ضمن "خيارات الشهادة الإضافية".
مربّع الاختيار تضمين إضافة CanSignHttpExchanges في الشهادة

إذا لم تتطابق شهادتك مع هذه الشروط، سيرفض المتصفحات والموزّعون ملف SXG الخاص بك لأسباب تتعلق بالأمان. يفترض هذا الدليل أنّ اسم ملف الشهادة التي حصلت عليها من DigiCert هو mySxg.pem.

الخطوة 2: تثبيت libsxg

تنسيق SXG معقّد ويصعب إنشاؤه بدون استخدام أدوات. يمكنك استخدام أحد الخيارات التالية لإنشاء SXG:

يستخدم هذا الدليل libsxg.

الخيار 1: تثبيت libsxg من حزمة Debian

يمكنك تثبيت الحزمة بالطريقة المعتادة في Debian، شرط تطابق إصدار OpenSSL (libssl-dev).

sudo apt install -y libssl-dev
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg0_0.2-1_amd64.deb
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg-dev_0.2-1_amd64.deb
sudo dpkg -i libsxg0_0.2-1_amd64.deb
sudo dpkg -i libsxg-dev_0.2-1_amd64.deb

الخيار 2: إنشاء libsxg يدويًا

إذا كنت لا تستخدم بيئة متوافقة مع ملفات .deb، يمكنك إنشاء libsxg بنفسك. كشرط أساسي، عليك تثبيت git وcmake وopenssl وgcc.

git clone https://github.com/google/libsxg
mkdir libsxg/build
cd libsxg/build
cmake .. -DRUN_TEST=false -DCMAKE_BUILD_TYPE=Release
make
sudo make install

الخطوة 3: تثبيت المكوّن الإضافي nginx

يتيح لك المكوّن الإضافي nginx إنشاء ملفات SXG ديناميكيًا بدلاً من إنشائها بشكل ثابت قبل عرضها.

الخيار 1: تثبيت المكوّن الإضافي من حزمة Debian

يتم توزيع وحدة SXG لنظام التشغيل nginx على GitHub. على الأنظمة المستندة إلى دبيان، يمكنك تثبيته كحزمة ثنائية:

sudo apt install -y nginx=1.15.9-0
wget https://github.com/google/nginx-sxg-module/releases/download/v0.1/libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb
sudo dpkg -i libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb

الخيار 2: إنشاء المكوّن الإضافي يدويًا

يتطلب إنشاء وحدة nginx رمز المصدر nginx. يمكنك الحصول على حزمة tar وإنشاءها مع الوحدة الديناميكية SXG باستخدام الأوامر التالية:

git clone https://github.com/google/nginx-sxg-module
wget https://nginx.org/download/nginx-1.17.5.tar.gz
tar xvf nginx-1.17.5.tar.gz
cd nginx-1.17.5
./configure --prefix=/opt/nginx --add-dynamic-module=../nginx-sxg-module --without-http_rewrite_module --with-http_ssl_module
make
sudo make install

تتسم إعدادات nginx بالمرونة الكبيرة. ثبِّت nginx في أي مكان في نظامك، ثم حدِّد مسارًا خاصًا بـ module/config/log/pidfile. يفترض هذا الدليل أنّك ستثبّت التطبيق على /opt/nginx.

الخطوة 4: ضبط مكوّن nginx الإضافي للعمل مع SXG

الخيار 1: ضبط وحدة nginx تم تثبيتها من Debian

اتّبِع هذه التعليمات إذا كنت قد استخدمت الخطوة 3، الخيار 1 في وقت سابق.

يتطلب إرسال محتوى SXG استخدام HTTPS. يمكنك الحصول على شهادة طبقة المقابس الآمنة/بروتوكول أمان طبقة النقل (TLS) من DigiCert وLet's Encrypt وخدمات أخرى. يُرجى العِلم أنّه لا يمكنك استخدام شهادة SXG لطبقة المقابس الآمنة أو العكس، لذا ستحتاج إلى شهادتَين. يجب أن يبدو ملف الإعدادات في /etc/nginx/nginx.conf مشابهًا لما يلي، بافتراض أنّك وضعت مفتاح/شهادة بروتوكول طبقة المقابس الآمنة (SSL) في /path/to/ssl/ ومفتاح/شهادة بروتوكول SXG في /path/to/sxg/:

user www-data;
include /etc/nginx/modules-enabled/*.conf;

events {
     worker_connections 768;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    add_header  X-Content-Type-Options nosniff;

    server {
        listen 443 ssl;
        ssl_certificate     /path/to/ssl/fullchain.pem;
        ssl_certificate_key /path/to/ssl/privkey.pem;
        server_name  website.test;

        sxg on;
        sxg_certificate     /path/to/sxg/mySxg.pem;
        sxg_certificate_key /path/to/sxg/mySxg.key;
        sxg_cert_url        https://website.test/certs/cert.cbor;
        sxg_validity_url    https://website.test/validity/resource.msg;
        sxg_cert_path       /certs/cert.cbor;

        root /var/www/html;
    }
}
  • إنّ sxg_cert_url ضروري لمتصفّحات لتحميل SXG بشكل صحيح لأنّه يحدّد موقع سلسلة الشهادات. تحتوي سلسلة الشهادات على شهادة ومعلومات تثبيت OCSP بتنسيق cbor. يُرجى العلم أنّه ليس عليك عرض ملف cert.cbor من المصدر نفسه. ويمكنك عرضها من خلال أيّ من شبكات توصيل المحتوى (CDN) أو خدمات عرض الملفات الثابتة الأخرى ما دامت تتوافق مع بروتوكول HTTPS.
  • من المخطّط أن يعرض sxg_validitiy_url معلومات ذات صلة برأس توقيع SXG. إذا لم يتم تعديل الصفحة منذ آخر ملف SXG، ليس من المطلوب من الناحية الفنية تنزيل ملف SXG بالكامل. وبالتالي، من المتوقّع أن يؤدي تعديل معلومات عنوان التوقيع وحده إلى تقليل عدد عمليات الوصول إلى الشبكة. ولكن لم يتم تنفيذ التفاصيل بعد.

ابدأ استخدام nginx وأصبح بإمكانك عرض إعلانات SXG.

sudo systemctl start nginx.service
curl -H"Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
cat index.html.sxg
sxg1-b3...https://website.test/...(omit)

الخيار 2: ضبط وحدة nginx تم إنشاؤها من المصدر

اتّبِع هذه التعليمات إذا كنت قد استخدمت الخطوة 3، الخيار 2 في وقت سابق.

اضبط نظام nginx المثبَّت ضمن /opt/nginx ليظهر بالشكل التالي:

load_module "/opt/nginx/modules/ngx_http_sxg_filter_module.so";

events {
    worker_connections 768;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    add_header X-Content-Type-Options nosniff;

    server {
        listen 443 ssl;
        ssl_certificate     /path/to/ssl/fullchain.pem;
        ssl_certificate_key /path/to/ssl/privkey.pem;
        server_name  example.com;

        sxg on;
        sxg_certificate     /path/to/sxg/mySxg.pem;
        sxg_certificate_key /path/to/sxg/mySxg.key;
        sxg_cert_url        https://website.test/certs/cert.cbor;
        sxg_validity_url    https://website.test/validity/resource.msg;
        sxg_cert_path       /certs/cert.cbor;

        root /opt/nginx/html;
    }
}

بعد ذلك، ابدأ nginx. يمكنك الآن الحصول على ملف SXG.

cd /opt/nginx/sbin
sudo ./nginx
curl -H "Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
less index.html.sxg
sxg1-b3...https://website.test/...(omit)

الخطوة 5: عرض الخلفية لتطبيقك

في الأمثلة أعلاه، يعرض nginx الملفات الثابتة في الدليل الجذر، ولكن يمكنك استخدام توجيهات المصدر لتطبيقاتك لإنشاء SXG لخدمات خلفية تطبيق الويب التعسفية (مثل Ruby on Rails أو Django أو Express) ما دام nginx يعمل كخادم أمامي لخدمة HTTP(S).

upstream app {
    server 127.0.0.1:8080;
}

server {
    location / {
        proxy_pass http://app;
    }
}

الخطوة 6: الاختبار

استخدِم أداة dump-signedexchange لاختبار صحة ملفات SXG التي يتم عرضها والتأكّد من عدم تسجيل أي أخطاء والتحقّق من أنّ الرؤوس والنصّ كما هو متوقّع.

go get -u github.com/WICG/webpackage/go/signedexchange/cmd/dump-signedexchange
export PATH=$PATH:~/go/bin
dump-signedexchange -verify -uri https://website.test/ | less

إرسال ملاحظات

يحرص مهندسو Chromium الذين يعملون على SXG على معرفة ملاحظاتك وآرائك على العنوان webpackage-dev@chromium.org. يمكنك أيضًا الانضمام إلى مناقشة المواصفات أو الإبلاغ عن خطأ للفريق. ستساعدنا ملاحظاتك كثيرًا في عملية وضع المعايير، كما ستساعدنا في معالجة مشاكل التنفيذ. شكرًا