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

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

Hiroki Kumazaki
Hiroki Kumazaki

Signature HTTP Exchanges (SXG) היא טכנולוגיית אינטרנט חדשה שמאפשרת למשתמשים להבחין בקלות רבה יותר בין יוצרי תוכן לבין מפיצי תוכן. במדריך הזה מוסבר איך להגדיר את SXG.

תמיכה בדפדפנים שונים

חלק מהדפדפנים מבוססי Chromium תומכים ב-SXG, כולל Google Chrome ו-Samsung אינטרנט ו-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 יום.
  • תיבת הסימון הכללת התוסף CanSignHttpExchanges באישור מופעלת. בקטע 'אפשרויות אישור נוספות'.
תיבת הסימון הכללת התוסף 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-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 מציג קבצים סטטיים בספריית השורש, אבל אפשר להשתמש בהוראות 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. תוכלו גם להצטרף לדיון על המפרט או לדווח על באג לצוות. המשוב שלכם יעזור מאוד בתהליך הסטנדרטיזציה וגם יעזור לטפל בבעיות הטמעה. תודה!