نحوه تولید گواهی TLS با پسوندهای SXG، نصب ابزارهایی برای تولید فایلهای SXG و پیکربندی nginx برای ارائه فایلهای SXG.
Signed HTTP Exchanges (SXG) یک فناوری وب جدید است که تشخیص سازندگان محتوا را از توزیعکنندگان محتوا برای کاربران آسانتر میکند. این راهنما به شما نشان می دهد که چگونه SXG را راه اندازی کنید.
پشتیبانی از مرورگرهای متقابل
چندین مرورگر مبتنی بر Chromium از SXG پشتیبانی میکنند، از جمله Google Chrome، Samsung Internet و Microsoft Edge. برای اطلاعات به روزتر، بخش اجماع و استانداردسازی مبادلات HTTP با امضای مبدا را ببینید.
پیش نیازها
برای پیاده سازی SXG در وب سایت خود، باید:
- دامنه خود از جمله ورودی های DNS را کنترل کنید.
- گواهینامه بگیرید 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 روز تجاوز نمی کند.
- گزینه Include CanSignHttpExchanges در چک باکس گواهی فعال است که در زیر گزینه های گواهی اضافی یافت می شود.
اگر گواهی شما با این شرایط مطابقت نداشته باشد، مرورگرها و توزیع کنندگان SXG شما را به دلایل امنیتی رد خواهند کرد. این راهنما فرض می کند که نام فایل گواهی که از DigiCert دریافت کرده اید mySxg.pem
است.
مرحله 2: libsxg
نصب کنید
فرمت SXG پیچیده و سخت است که بدون استفاده از ابزار تولید می شود. برای تولید SXG می توانید از یکی از گزینه های زیر استفاده کنید:
- ابزار gen-signedexchange که در Go نوشته شده است.
- کتابخانه
libsxg
که به زبان C نوشته شده است.
این راهنما از libsxg
استفاده می کند.
گزینه 1: libsxg
از بسته 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: افزونه را از بسته دبیان نصب کنید
ماژول 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
نیاز دارد. با استفاده از دستورات زیر می توانید 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
نصب شده از دبیان را پیکربندی کنید
اگر قبلاً از مرحله 3، گزینه 1 استفاده کرده اید، این دستورالعمل ها را دنبال کنید.
ارائه محتوای SXG به HTTPS نیاز دارد. می توانید گواهی SSL/TLS را از DigiCert، Let's Encrypt و سایر سرویس ها دریافت کنید. توجه داشته باشید که نمی توانید از گواهی SXG برای SSL یا برعکس استفاده کنید، بنابراین به دو گواهی نیاز خواهید داشت. فایل پیکربندی در /etc/nginx/nginx.conf
باید شبیه به شکل زیر باشد، با فرض اینکه جفت کلید/گواهی SSL را در /path/to/ssl/
و جفت کلید/گواهی SXG را در /path/to/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 پشتیبانی میکند، میتوانید آن را از طریق هر CDN یا سایر سرویسهای ارائهدهنده فایل استاتیک ارائه کنید. -
sxg_validitiy_url
برای ارائه اطلاعات مربوط به SXG-signature-header برنامه ریزی شده است. اگر صفحه ای از آخرین 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 هستند. همچنین میتوانید به بحث مشخصات بپیوندید یا یک اشکال را به تیم گزارش دهید . بازخورد شما تا حد زیادی به فرآیند استانداردسازی کمک می کند و همچنین به رفع مشکلات پیاده سازی کمک می کند. متشکرم!