nginx kullanarak İmzalanmış HTTP Değişimleri (SXG) ayarlama

SXG uzantılarıyla TLS sertifikası oluşturma, SXG dosyaları oluşturmaya yönelik araçlar yükleme ve nginx'i SXG dosyaları sunmaya yönelik yapılandırma

Hiroki Kumazaki
Hiroki Kumazaki

İmzalı HTTP Takası (SXG), kullanıcıların içerik üreticileri içerik dağıtımcılardan ayırt etmesini kolaylaştıran yeni bir web teknolojisidir. Bu kılavuzda, SXG'nin nasıl kurulacağı gösterilmektedir.

Tarayıcılar arası destek

Google Chrome, Samsung dahil olmak üzere çeşitli Chromium tabanlı tarayıcılar SXG'yi destekler Microsoft Edge'dir. Bkz. Fikir Birliği ve Standartlaştırma bölümü Kaynak İmzalı HTTP Takasları ziyaret edin.

Ön koşullar

SXG'yi web sitenizde uygulamak için:

  • DNS girişleri de dahil olmak üzere alanınız üzerinde denetim sahibidir.
  • Sertifika al'ı tıklayın. SXG, özel bir sertifikanın verilmesini gerektirir. Özellikle, TLS anahtarınızı veya sertifikanızı yeniden kullanamazsınız.
  • HTTPS üzerinden SXG oluşturup sunabilen bir HTTP sunucusuna sahip olma.

Varsayımlar

Bu kılavuzda şunları yaptığınız varsayılmaktadır:

  • OpenSSL 1.1.1 ortamına sahip olmalısınız. Bu kılavuz, amd64 ISA üzerinde Ubuntu 18.04 LTS ile yazılmıştır.
  • Yürütülebilir dosyaları yüklemek için sudo komutunu çalıştırabilirsiniz.
  • nginx adresini, HTTP sunucusu olarak kullanın.
  • Şu anda bu uzantıları destekleyen tek sağlayıcı olduğu için DigiCert'ü SXG ile ilgili uzantıları içeren sertifikalar oluşturmak için kullanıyorsanız.

Ayrıca, bu makaledeki örnek komutlarda alanınızın website.test olduğu varsayılmıştır. Bu nedenle, website.test yerine gerçek alan adınızı girmeniz gerekir.

1. Adım: SXG için sertifikanızı alın

SXG oluşturmak için belirli bir anahtar türüne ve CanSignHttpExchanges uzantılı bir TLS sertifikasına ihtiyacınız vardır. DigiCert, bu uzantıya sahip sertifikalar sağlar. Sertifika vermek için CSR dosyasına ihtiyacınız vardır. Bu nedenle, aşağıdaki komutları kullanarak dosyayı oluşturun:

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"

Aşağıdaki gibi bir CSR dosyası alırsınız:

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

Aşağıdakilerden emin olun:

  • Geçerlilik süresi 90 günü aşmamalıdır.
  • Include the CanSignHttpExchanges uzantısını sertifikaya dahil et onay kutusu işaretliyse tıklayın.
ziyaret edin.
Include the CanSignHttpExchanges uzantısını sertifikaya dahil et onay kutusu.

Sertifikanız bu koşulları karşılamıyorsa tarayıcılar ve distribütörler, güvenlik nedeniyle SXG'nizi reddeder. Bu kılavuzda, DigiCert'den aldığınız sertifikanın dosya adının mySxg.pem olduğu varsayılmıştır.

2. Adım: libsxg uygulamasını yükleyin

SXG biçimi karmaşıktır ve araç kullanılmadan oluşturulması zordur. SXG oluşturmak için aşağıdaki seçeneklerden birini kullanabilirsiniz:

Bu kılavuzda libsxg kullanılmaktadır.

1. Seçenek: libsxg hizmetini Debian paketinden yükleme

OpenSSL (libssl-dev) sürümü eşleştiği sürece paketi her zamanki Debian yolunu kullanarak yükleyebilirsiniz.

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. Seçenek: libsxg manuel olarak oluşturma

.deb dosyalarıyla uyumlu bir ortam kullanmıyorsanız libsxg kendiniz oluşturabilirsiniz. Ön koşul olarak git, cmake, openssl ve gcc uygulamalarını yüklemeniz gerekir.

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. Adım: nginx eklentisini yükleyin

nginx eklentisi, SXG'yi sunmadan önce statik olarak oluşturmak yerine dinamik olarak oluşturmanıza olanak tanır.

1. Seçenek: Eklentiyi Debian paketinden yükleyin

nginx için SXG modülü GitHub'da dağıtılmıştır. Debian tabanlı sistemlerde ise bunu ikili paket olarak yükleyebilirsiniz:

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. Seçenek: Eklentiyi manuel olarak oluşturma

nginx modülünü oluşturmak için nginx kaynak kodu gerekir. Aşağıdaki komutları kullanarak tarball'u alıp SXG dinamik modülüyle birlikte oluşturabilirsiniz:

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 yapılandırması son derece esnektir. nginx uygulamasını sisteminizde herhangi bir yere yükleyin, ardından ilgili module/config/log/pidfile yolunu belirtin. Bu kılavuzda, uygulamayı /opt/nginx ürününe yüklediğiniz varsayılmaktadır.

4. Adım: nginx eklentisini SXG ile çalışacak şekilde yapılandırın

1. seçenek: Debian'dan yüklenen nginx modülü yapılandırma

Daha önce 3. Adım, 1. Seçeneği kullandıysanız bu talimatları uygulayın.

SXG içeriği göndermek için HTTPS gerekir. DigiCert, Let's Encrypt ve diğer hizmetlerden SSL/TLS sertifikası alabilirsiniz. SSL için SXG sertifikası (veya tam tersi) KULLANAMAZ ve bu nedenle iki sertifikaya ihtiyacınız olacağını unutmayın. SSL anahtarı/sertifika çiftini /path/to/ssl/, SXG anahtarı/sertifika çiftini de /path/to/sxg/ konumuna eklediğiniz varsayıldığında, /etc/nginx/nginx.conf ürünündeki yapılandırma dosyası aşağıdakine benzer olacaktır:

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, sertifika zincirini bulduğundan tarayıcıların SXG'yi doğru şekilde yüklemesi için son derece önemlidir. Sertifika zinciri, cbor biçimine sahip sertifika ve OCSP zıplama bilgilerini içerir. cert.cbor dosyasını aynı kaynaktan sunmanız gerekmediğini unutmayın. HTTPS'yi desteklediği sürece dosyayı herhangi bir CDN veya diğer statik dosya sunma hizmetleri aracılığıyla sunabilirsiniz.
  • sxg_validitiy_url hizmetinin SXG imzası-başlık ile ilgili bilgileri sunması planlanmaktadır. Bir sayfa son SXG'den bu yana değiştirilmediyse teknik olarak SXG dosyasının tamamını indirmek gerekmez. Bu nedenle, yalnızca imza başlığı bilgilerini güncellemenin ağ trafiğini azaltması beklenir. Ancak ayrıntılar henüz uygulanmadı.

nginx kullanmaya başlayın ve SXG kullanmaya hazırsınız.

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. Seçenek: Kaynaktan yerleşik nginx modülü yapılandırma

Daha önce 3. Adım, 2. Seçeneği kullandıysanız bu talimatları uygulayın.

/opt/nginx kapsamında yüklenen nginx sisteminizi aşağıdaki örneğe benzer şekilde yapılandırın:

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

Ardından, nginx işlemini başlatın. Artık SXG'nizi alabilirsiniz.

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. Adım: Uygulamanızın arka ucunu sunun

Yukarıdaki örneklerde nginx, kök dizinde statik dosyalar sunar. Ancak nginx cihazınız ön HTTP (S) sunucusu olarak çalıştığı sürece rastgele web uygulaması arka uçları(Ruil on Rails, Django veya Express gibi) için SXG oluşturmak üzere uygulamalarınızda yukarı akış yönergeleri kullanabilirsiniz.

upstream app {
    server 127.0.0.1:8080;
}

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

6. Adım: Test edin

Döküm imzalı değişim aracını kullanma test etmek, sunulan SXG'lerin doğru olduğunu test etmek, hata bildirilmediğinden emin olmak ve olması gerektiği gibidir.

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

Geri bildirim gönder

SXG üzerinde çalışan Chromium mühendisleri webpackage-dev@chromium.org adresinden geri bildiriminizi duymaktan memnuniyet duyar. Ayrıca, spesifikasyon tartışmalarına katılabilir veya ekibe bir hata bildirebilirsiniz. Geri bildirimleriniz, standartlaştırma sürecine büyük katkıda bulunacak ve uygulama sorunlarının çözülmesine yardımcı olacaktır. Teşekkürler!