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