איך יוצרים אישור 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 the CanSignHttpExchanges extension in the certificate (הכללת התוסף CanSignHttpExchanges באישור) מסומנת בקטע Additional Certificate Options (אפשרויות נוספות לאישור).
אם האישור לא עומד בתנאים האלה, דפדפנים ומפיצים יידחו את קובץ ה-SXG שלכם מסיבות אבטחה.
במדריך הזה אנחנו יוצאים מנקודת הנחה ששם הקובץ של האישור שקיבלת מ-DigiCert הוא mySxg.pem
.
שלב 2: מתקינים את libsxg
הפורמט SXG הוא מורכב וקשה ליצור אותו בלי להשתמש בכלים. אפשר להשתמש באחת מהאפשרויות הבאות כדי ליצור קובץ SXG:
- הכלי gen-signedexchange שנכתב ב-Go.
- הספרייה
libsxg
שנכתבה בשפת C.
במדריך הזה נעשה שימוש ב-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. אפשר גם להצטרף לדיון על המפרט או לדווח לצוות על באג. המשוב שלכם יעזור מאוד בתהליך התקינה, וגם יעזור לטפל בבעיות בהטמעה. תודה!