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

SXG uzantılarıyla TLS sertifikası oluşturma, SXG dosyası oluşturma araçlarını yükleme ve nginx'i SXG dosyaları yayınlayacak şekilde yapılandırma.

Hiroki Kumazaki
Hiroki Kumazaki

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

Google Chrome, Samsung Internet ve Microsoft Edge gibi çeşitli Chromium tabanlı tarayıcılar SXG'yi destekler. Daha güncel bilgiler için Kaynak İmzalı HTTP Değişimleri başlıklı makalenin Fikir Birliği ve Standartlaştırma bölümüne bakın.

Ön koşullar

SXG'yi web sitenize uygulamak için:

  • DNS girişleri dahil olmak üzere alanınız üzerinde kontrol sahibi olma.
  • Sertifika alın. SXG için özel bir sertifika verilmesi gerekir. Özellikle de TLS anahtarınızı veya sertifikanızı yeniden kullanamazsınız.
  • HTTPS üzerinden SXG oluşturabilen ve 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'ü çalıştırabilme
  • nginx kaynağını HTTP sunucusu olarak kullanın.
  • Şu anda bu uzantıları destekleyen tek sağlayıcı olduğu için SXG ile ilgili uzantılar içeren sertifikalar oluşturmak için DigiCert'i kullanıyorsanız.

Ayrıca, bu makaledeki örnek komutlarda alanınızın website.test olduğu varsayılır. Bu nedenle, website.test değerini gerçek alanınızla değiştirmeniz gerekir.

1. Adım: SXG sertifikanızı alın

SXG oluşturmak için CanSignHttpExchanges uzantılı bir TLS sertifikasının yanı sıra belirli bir anahtar türüne ihtiyacınız vardır. DigiCert, bu uzantıya sahip sertifikalar sağlar. Sertifika oluşturmak için bir CSR dosyasına ihtiyacınız vardır. Bu dosyayı aşağıdaki komutlarla 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.
  • Ek Sertifika Seçenekleri bölümündeki CanSignHttpExchanges uzantısını sertifikaya ekle onay kutusu etkinleştirilir.
CanSignHttpExchanges uzantısını sertifikaya dahil et onay kutusunu işaretleyin.

Sertifikanızın bu koşullarla eşleşmemesi durumunda tarayıcılar ve distribütörler, güvenlik nedeniyle SXG'nizi reddeder. Bu kılavuzda, DigiCert'ten aldığınız sertifikanın dosya adının mySxg.pem olduğu varsayılmaktadır.

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

SXG biçimi karmaşıktır ve araç kullanmadan 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'ü Debian paketinden yükleme

OpenSSL (libssl-dev) sürümü eşleştiği sürece paketi normal Debian yöntemiyle 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'leri yayınlamadan önce statik olarak oluşturmak yerine dinamik olarak oluşturmanıza olanak tanır.

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

nginx için SXG modülü GitHub'da dağıtılı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ü derlemek 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ı çok esnektir. nginx dosyasını sisteminize herhangi bir yere yükleyin ve ardından module/config/log/pidfile için ilgili yolu belirtin. Bu kılavuzda, /opt/nginx konumuna 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 bir nginx modülünü yapılandırma

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

SXG içeriği yayınlamak için HTTPS gerekir. DigiCert, Let's Encrypt ve diğer hizmetlerden SSL/TLS sertifikası alabilirsiniz. SSL için SXG sertifikası veya bunun tersi şekilde SXG için SSL sertifikası kullanamayacağınızı unutmayın. Bu nedenle iki sertifika kullanmanız gerekir. SSL anahtar/sertifika çiftini /path/to/ssl/'a, SXG anahtar/sertifika çiftini ise /path/to/sxg/'ye koyduğunuz varsayılarak /etc/nginx/nginx.conf'teki yapılandırma dosyası aşağıdakine benzer şekilde görünmelidir:

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ğu için tarayıcıların SXG'yi düzgün şekilde yüklemesi için gereklidir. Sertifika zinciri, cbor biçiminde sertifika ve OCSP stapling bilgilerini içerir. cert.cbor dosyasını aynı kaynaktan yayınlamanız gerekmediğini unutmayın. HTTPS'yi desteklediği sürece bu dosyayı herhangi bir CDN veya diğer statik dosya yayınlama hizmetleri aracılığıyla yayınlayabilirsiniz.
  • sxg_validitiy_url, SXG-signature-header ile ilgili bilgileri sunmak için planlanmıştır. Bir sayfa son SXG'den bu yana değiştirilmediyse SXG dosyasının tamamının indirilmesi teknik olarak gerekli değildir. Bu nedenle, yalnızca imza başlık bilgilerini güncellemenin ağ trafiğini azaltması beklenir. Ancak ayrıntılar henüz uygulanmadı.

nginx'ü başlatın ve SXG yayınlamaya 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 derlenmiş bir nginx modülü yapılandırma

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

/opt/nginx altında yüklü 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'ü 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 ön HTTP (S) sunucusu olarak çalıştığı sürece, uygulamalarınızdaki yukarı akış yönergelerini kullanarak rastgele web uygulaması arka uçları(Ruby on Rails, Django veya Express gibi) için SXG oluşturabilirsiniz.

upstream app {
    server 127.0.0.1:8080;
}

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

6. adım: Test edin

Sunulan SXG'lerin doğru olduğunu test etmek, hata bildirilmediğinden emin olmak ve üstbilgilerin ve gövdenin beklendiği gibi olduğunu doğrulamak için dump-signedexchange aracını kullanın.

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 bildirimlerinizi bekliyor. Ayrıca, spesifikasyon tartışmalarına katılabilir veya ekibe bir hata bildirebilirsiniz. Geri bildiriminiz, standartlaştırma sürecine ve uygulama sorunlarının giderilmesine büyük ölçüde yardımcı olacaktır. Teşekkürler!