วิธีสร้างใบรับรอง TLS ด้วยส่วนขยาย SXG, ติดตั้งเครื่องมือสำหรับการสร้างไฟล์ SXG และกำหนดค่า nginx ให้แสดงไฟล์ SXG
Signed HTTP Exchange (SXG) เป็นเทคโนโลยีเว็บแบบใหม่ที่ช่วยให้ผู้ใช้แยกแยะผู้สร้างเนื้อหาออกจากผู้เผยแพร่เนื้อหาได้ง่ายขึ้น คู่มือนี้แสดงวิธีตั้งค่า SXG
การรองรับในทุกเบราว์เซอร์
เบราว์เซอร์แบบ Chromium หลายเบราว์เซอร์รองรับ SXG ซึ่งรวมถึง Google Chrome, Samsung อินเทอร์เน็ตและ Microsoft Edge โปรดดูส่วนความเห็นพ้องและมาตรฐานในหัวข้อ Exchange HTTP Exchange ที่ลงชื่อจากต้นทาง เพื่อดูข้อมูลล่าสุด
ข้อกำหนดเบื้องต้น
หากต้องการใช้ 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 ในใบรับรองเปิดอยู่ ที่อยู่ใต้ตัวเลือกใบรับรองเพิ่มเติม
![](https://web.developers.google.cn/static/articles/how-to-set-up-signed-http-exchanges/image/kFWTZFXNvwkHnwRu7y8Q.png?authuser=9&hl=th)
หากใบรับรองไม่ตรงกับเงื่อนไขเหล่านี้ เบราว์เซอร์และผู้จัดจำหน่ายจะปฏิเสธ 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 หรือในทางกลับกันไม่ได้ คุณจึงจะต้องมีใบรับรอง 2 ใบ ไฟล์การกำหนดค่าใน /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 ใดก็ได้หรือบริการแสดงไฟล์แบบคงที่อื่นๆ ตราบใดที่รองรับ HTTPSsxg_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
ให้บริการไฟล์แบบคงที่ในไดเรกทอรีราก แต่คุณสามารถใช้คำสั่งอัปสตรีมสำหรับแอปพลิเคชันของคุณเพื่อสร้าง 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 นอกจากนี้ คุณยังเข้าร่วมการสนทนาเกี่ยวกับข้อกำหนดหรือรายงานข้อบกพร่องให้ทีมทราบได้ด้วย ความคิดเห็นของคุณจะช่วยในขั้นตอนการกำหนดมาตรฐานได้อย่างมากและช่วยแก้ปัญหาการใช้งาน ขอขอบคุณ