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

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

Hiroki Kumazaki
Hiroki Kumazaki

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

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

تتوافق العديد من المتصفحات المستندة إلى Chromium مع SXG، بما في ذلك Google Chrome وSamsung و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. ويمكنك الحصول على قاعدة البيانات الأسطوانية وتصميمها جنبًا إلى جنب مع وحدة 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 التي يتم تثبيتها من نظام دبيان

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

يتطلّب تقديم محتوى SXG استخدام HTTPS. يمكنك الحصول على شهادة SSL/TLS من DigiCert وLet's Encrypt وغيرها من الخدمات. يُرجى العِلم أنّه لا يمكنك استخدام شهادة SXG لطبقة المقابس الآمنة أو العكس، وبالتالي ستحتاج إلى شهادتَين. من المفترض أن يبدو ملف الإعداد في /etc/nginx/nginx.conf مشابهًا لما يلي، على افتراض أنّك وضعت زوج المفتاح/الشهادة طبقة المقابس الآمنة في /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 من المصدر نفسه. ويمكنك عرضه عبر أي شبكات توصيل للمحتوى أو عبر خدمات عرض ملفات ثابتة أخرى طالما أنه يتوافق مع HTTPS.
  • تم التخطيط لـ sxg_validitiy_url لعرض المعلومات المتعلقة بعنوان SXG-signature. إذا لم يتم تعديل الصفحة منذ آخر عملية 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. يمكنك أيضًا الانضمام إلى مناقشة المواصفات أو إبلاغ الفريق عن خطأ. ستساعد ملاحظاتك جدًا في عملية توحيد المقاييس ومعالجة مشاكل التنفيذ. شكرًا