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