كيفية إنشاء شهادة بروتوكول أمان طبقة النقل (TLS) بإضافات SXG، وتثبيت أدوات لإنشاء ملفات SXG، وضبط بروتوكول nginx لعرض ملفات SXG.
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 في الشهادة، والتي يمكن العثور عليها ضمن "خيارات الشهادة الإضافية".
في حال لم تتطابق شهادتك مع هذه الشروط، سترفض المتصفِّحات والموزّعون SXG لأسباب أمنية.
يفترض هذا الدليل أن اسم ملف الشهادة التي حصلت عليها من DigiCert هو mySxg.pem
.
الخطوة 2: تثبيت libsxg
إنّ تنسيق SXG معقّد ويصعب إنشاؤه بدون استخدام أدوات. يمكنك استخدام أحد الخيارات التالية لإنشاء SXG:
- أداة gen-signedexchange المكتوبة في Go.
- مكتبة
libsxg
المكتوبة بلغة C.
يستخدم هذا الدليل "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. يمكنك أيضًا الانضمام إلى مناقشة المواصفات أو إبلاغ الفريق عن خطأ. ستساعد ملاحظاتك جدًا في عملية توحيد المقاييس ومعالجة مشاكل التنفيذ. شكرًا