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