Cara menyiapkan Signed HTTP Exchanges (SXG) menggunakan nginx

Cara membuat sertifikat TLS dengan ekstensi SXG, menginstal alat untuk menghasilkan file SXG, dan mengonfigurasi nginx untuk menyalurkan file SXG.

Hiroki Kumazaki
Hiroki Kumazaki

Signed HTTP Exchange (SXG) adalah teknologi web baru yang mempermudah pengguna membedakan kreator konten dari distributor konten. Panduan ini menunjukkan cara menyiapkan SXG.

Dukungan lintas browser

Beberapa browser berbasis Chromium mendukung SXG, termasuk Google Chrome, Samsung Internet, dan Microsoft Edge. Lihat bagian Konsensus dan Standardisasi di Pertukaran HTTP yang Ditandatangani Origin untuk mengetahui informasi terbaru.

Prasyarat

Untuk menerapkan SXG di situs, Anda harus:

  • Memiliki kontrol atas domain Anda, termasuk entri DNS.
  • Dapatkan sertifikat. SXG memerlukan penerbitan sertifikat khusus. Secara khusus, Anda tidak dapat menggunakan kembali kunci atau sertifikat TLS Anda.
  • Memiliki server HTTP yang dapat membuat dan menyalurkan SXG melalui HTTPS.

Asumsi

Panduan ini mengasumsikan bahwa Anda:

  • Memiliki lingkungan OpenSSL 1.1.1. Panduan ini ditulis dengan Ubuntu 18.04 LTS pada amd64 ISA.
  • Memiliki kemampuan untuk menjalankan sudo guna menginstal file yang dapat dieksekusi.
  • Gunakan nginx sebagai server HTTP.
  • Menggunakan DigiCert untuk membuat sertifikat yang mencakup ekstensi terkait SXG, karena saat ini tampaknya ini adalah satu-satunya penyedia yang mendukung ekstensi ini.

Selain itu, contoh perintah dalam artikel ini mengasumsikan domain Anda adalah website.test, sehingga Anda harus mengganti website.test dengan domain Anda yang sebenarnya.

Langkah 1: Dapatkan sertifikat Anda untuk SXG

Untuk membuat SXG, Anda memerlukan sertifikat TLS dengan ekstensi CanSignHttpExchanges, serta jenis kunci tertentu. DigiCert menyediakan sertifikat dengan ekstensi ini. Anda memerlukan file CSR untuk penerbitan sertifikat, jadi buat dengan perintah berikut:

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"

Anda akan mendapatkan file CSR yang terlihat seperti berikut:

-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----

Pastikan:

  • Periode validitas tidak melebihi 90 hari.
  • Kotak centang Sertakan ekstensi CanSignHttpExchanges di sertifikat diaktifkan, yang dapat ditemukan di bagian Opsi Sertifikat Tambahan.
Kotak centang Sertakan ekstensi CanSignHttpExchanges dalam sertifikat.

Jika sertifikat Anda tidak cocok dengan ketentuan ini, browser dan distributor akan menolak SXG Anda karena alasan keamanan. Panduan ini mengasumsikan bahwa nama file sertifikat yang Anda dapatkan dari DigiCert adalah mySxg.pem.

Langkah 2: Instal libsxg

Format SXG kompleks dan sulit dibuat tanpa menggunakan alat. Anda dapat menggunakan salah satu opsi berikut untuk membuat SXG:

Panduan ini menggunakan libsxg.

Opsi 1: Menginstal libsxg dari paket Debian

Anda dapat menginstal paket dengan cara Debian biasa, selama versi OpenSSL (libssl-dev) cocok.

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

Opsi 2: Buat libsxg secara manual

Jika tidak menggunakan lingkungan yang kompatibel dengan file .deb, Anda dapat mem-build libsxg sendiri. Sebagai prasyarat, Anda harus menginstal git, cmake, openssl, dan 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

Langkah 3: Instal plugin nginx

Plugin nginx memungkinkan Anda membuat SXG secara dinamis, bukan membuatnya secara statis sebelum penayangan.

Opsi 1: Menginstal plugin dari paket Debian

Modul SXG untuk nginx didistribusikan di GitHub. Pada sistem berbasis Debian, Anda dapat menginstalnya sebagai paket biner:

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

Opsi 2: Buat plugin secara manual

Pembuatan modul nginx memerlukan kode sumber nginx. Anda bisa mendapatkan tarball dan mem-build-nya bersama dengan modul dinamis SXG menggunakan perintah di bawah ini:

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

Konfigurasi nginx memiliki fleksibilitas tinggi. Instal nginx di mana saja di sistem Anda, lalu tentukan jalur module/config/log/pidfile masing-masing. Panduan ini mengasumsikan bahwa Anda menginstalnya ke /opt/nginx.

Langkah 4: Konfigurasikan plugin nginx agar berfungsi dengan SXG

Opsi 1: Mengonfigurasi modul nginx yang diinstal dari Debian

Ikuti petunjuk ini jika Anda menggunakan Langkah 3, Opsi 1 sebelumnya.

Pengiriman konten SXG memerlukan HTTPS. Anda bisa mendapatkan sertifikat SSL/TLS dari DigiCert, Let's Encrypt, dan layanan lainnya. Perhatikan bahwa Anda TIDAK DAPAT menggunakan sertifikat SXG untuk SSL atau sebaliknya, oleh karena itu Anda akan memerlukan dua sertifikat. File konfigurasi di /etc/nginx/nginx.conf akan terlihat seperti berikut, dengan asumsi bahwa Anda menempatkan pasangan kunci/sertifikat SSL di /path/to/ssl/ dan pasangan kunci/sertifikat SXG di /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 sangat penting bagi browser untuk memuat SXG dengan benar karena menemukan rantai sertifikat. Rantai sertifikat berisi sertifikat dan informasi penempelan OCSP dengan format cbor. Perhatikan bahwa Anda tidak perlu menyajikan file cert.cbor dari origin yang sama. Anda dapat menayangkannya melalui CDN atau layanan penayangan file statis lainnya selama mendukung HTTPS.
  • sxg_validitiy_url direncanakan untuk menyajikan informasi terkait header tanda tangan SXG. Jika halaman belum diubah sejak SXG terakhir, mendownload seluruh file SXG tidak diperlukan secara teknis. Jadi, memperbarui informasi {i>signature header<i} saja diharapkan dapat mengurangi lalu lintas jaringan. Namun, detailnya belum diterapkan.

Mulai nginx dan Anda siap menayangkan 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)

Opsi 2: Mengonfigurasi modul nginx bawaan dari sumber

Ikuti petunjuk ini jika Anda menggunakan Langkah 3, Opsi 2 sebelumnya.

Konfigurasikan sistem nginx yang diinstal di /opt/nginx agar terlihat seperti contoh berikut:

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;
    }
}

Lalu mulai nginx. Sekarang Anda bisa mendapatkan 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)

Langkah 5: Menayangkan backend aplikasi

Dalam contoh di atas, nginx menyajikan file statis di direktori utama, tetapi Anda dapat menggunakan perintah upstream untuk aplikasi Anda guna membuat SXG bagi backend aplikasi web arbitrer (seperti Ruby on Rails, Django, atau Express) selama nginx Anda berfungsi sebagai server HTTP(S) depan.

upstream app {
    server 127.0.0.1:8080;
}

server {
    location / {
        proxy_pass http://app;
    }
}

Langkah 6: Uji

Gunakan alat dump-signedExchange untuk menguji apakah SXG yang ditayangkan sudah benar, memastikan tidak ada error yang dilaporkan, dan memverifikasi bahwa header dan isi seperti yang diharapkan.

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

Kirim masukan

Engineer Chromium yang menangani SXG ingin mendengar masukan Anda di webpackage-dev@chromium.org. Anda juga dapat bergabung dalam diskusi spesifikasi, atau melaporkan bug kepada tim. Masukan Anda akan sangat membantu proses standardisasi dan membantu mengatasi masalah implementasi. Terima kasih