نحوه راه اندازی صرافی های HTTP امضا شده (SXG) با استفاده از nginx

نحوه تولید گواهی TLS با پسوندهای SXG، نصب ابزارهایی برای تولید فایل‌های SXG و پیکربندی nginx برای ارائه فایل‌های SXG.

هیروکی کومازاکی
Hiroki Kumazaki

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 در چک باکس گواهی فعال است که در زیر گزینه های گواهی اضافی یافت می شود.
افزونه CanSignHttpExchanges را در چک باکس گواهی وارد کنید .

اگر گواهی شما با این شرایط مطابقت نداشته باشد، مرورگرها و توزیع کنندگان SXG شما را به دلایل امنیتی رد خواهند کرد. این راهنما فرض می کند که نام فایل گواهی که از DigiCert دریافت کرده اید mySxg.pem است.

مرحله 2: libsxg را نصب کنید

فرمت SXG پیچیده و سخت است که بدون استفاده از ابزار تولید می شود. برای تولید SXG می توانید از یکی از گزینه های زیر استفاده کنید:

این راهنما از 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 را برای backendهای برنامه‌های وب دلخواه (مانند 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 هستند. همچنین می‌توانید به بحث مشخصات بپیوندید یا یک اشکال را به تیم گزارش دهید . بازخورد شما تا حد زیادی به فرآیند استانداردسازی کمک می کند و همچنین به رفع مشکلات پیاده سازی کمک می کند. متشکرم!