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

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

Hiroki Kumazaki
Hiroki Kumazaki

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

التوافق مع المتصفحات

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

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

لتطبيق آلية SXG على موقعك الإلكتروني، يجب:

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

الفرضيّات

يفترض هذا الدليل ما يلي:

  • توفُّر بيئة OpenSSL 1.1.1. تمت كتابة هذا الدليل باستخدام Ubuntu 18.04 LTS على 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. وعلى الأنظمة المستندة إلى Debian، يمكنك تثبيته كحزمة ثنائية:

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. يمكنك الحصول على لعبة tarball وتصميمها جنبًا إلى جنب مع الوحدة الديناميكية 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 في "sxg_validitiy_url". إذا لم يتم تعديل الصفحة منذ تاريخ آلية 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-Signed Exchange لاختبار صحة ملفات 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. ويمكنك أيضًا الانضمام إلى مناقشة المواصفات، أو الإبلاغ عن خطأ إلى الفريق. ستساعد ملاحظاتك بشكل كبير في عملية توحيد المقاييس كما ستساعد في معالجة مشاكل التنفيذ. شكرًا