איך להגדיר 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. למידע עדכני יותר, קראו את הקטע 'קונצנזוס ותקינה' במאמר Origin-Signed HTTP Exchange.

דרישות מוקדמות

כדי להטמיע את SXG באתר, צריך:

  • לשלוט בדומיין שלכם, כולל רשומות DNS.
  • קבלת אישורים. SXG מחייב הנפקת אישור ייעודי. באופן ספציפי, לא ניתן להשתמש שוב במפתח או באישור של ה-TLS.
  • צריך להיות לכם שרת HTTP שיכול ליצור ולהציג SXG ב-HTTPS.

הנחות

המדריך מתבסס על ההנחה ש:

  • סביבת העבודה עם OpenSSL 1.1.1. המדריך הזה נכתב באמצעות Ubuntu 18.04 LTS ב-amad64 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 in the Certificate מופעלת, שנמצאת בקטע 'אפשרויות אישור נוספות'.
מסמנים את התיבה Include the CanSignHttpExchanges extensions in the Certificate.

אם האישור לא עומד בתנאים האלה, הדפדפנים והמפיצים ידחו את ה-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 קודם לכן, יש לפעול לפי ההוראות הבאות.

נדרש HTTPS כדי להעביר תוכן מסוג SXG. אפשר לקבל אישור 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. אפשר גם להצטרף לדיון במפרט או לדווח על באג לצוות. המשוב שלך יעזור לנו מאוד לתהליך הסטנדרטיזציה וגם יעזור לטפל בבעיות בהטמעה. תודה.