איך להגדיר Signed HTTP Exchange (SXG) באמצעות nginx

איך יוצרים אישור TLS עם תוספים של SXG, מתקינים כלים ליצירת קובצי SXG ומגדירים את nginx להצגת קובצי SXG.

Hiroki Kumazaki
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 the CanSignHttpExchanges extension in the certificate (הכללת התוסף CanSignHttpExchanges באישור) מסומנת בקטע Additional Certificate Options (אפשרויות נוספות לאישור).
תיבת הסימון Include the CanSignHttpExchanges extension in the certificate (הכללת התוסף 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. אפשר לקבל אישור SSL או TLS מ-DigiCert, מ-Let's Encrypt ומשירותים אחרים. חשוב לזכור: אי אפשר להשתמש באישור SXG ל-SSL או להפך, לכן נדרשים שני אישורים. קובץ התצורה ב-/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_validitiy_url מיועד להציג מידע שקשור לכותרת החתימה של SXG. אם דף לא השתנה מאז קובץ ה-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 מציג קבצים סטטיים בספריית הבסיס, אבל אפשר להשתמש בהוראות upstream לאפליקציות כדי ליצור קובצי 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. אפשר גם להצטרף לדיון על המפרט או לדווח לצוות על באג. המשוב שלכם יעזור מאוד בתהליך התקינה, וגם יעזור לטפל בבעיות בהטמעה. תודה!