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

SXG uzantılarıyla TLS sertifikası oluşturma, SXG dosyaları oluşturmak için araçları yükleme ve nginx'i SXG dosyaları sunacak şekilde yapılandırma.

Hiroki Kumazaki
Hiroki Kumazaki

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

Tarayıcılar arası destek

Google Chrome, Samsung Internet ve Microsoft Edge gibi Chromium tabanlı tarayıcılar SXG'yi destekler. Daha güncel bilgi için Kaynak İmzalı HTTP Takasları'nın mutabakat ve standartlaştırma bölümüne bakın.

Ön koşullar

SXG'yi web sitenizde uygulamak için şunları yapmanız gerekir:

  • DNS girişleri de dahil olmak üzere alanınız üzerinde denetim sahibi olun.
  • Sertifikaları alın. SXG, özel bir sertifika verilmesini gerektirir. Özellikle, TLS anahtarınızı veya sertifikanızı yeniden kullanamazsınız.
  • HTTPS üzerinden SXG oluşturup sunabilen bir HTTP sunucusuna sahip olmalısınız.

Varsayımlar

Bu kılavuzda, aşağıdakilerin olduğu varsayılmaktadır:

  • OpenSSL 1.1.1 ortamına sahip olmak. 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ırma yeteneğine sahip olun.
  • nginx'yi HTTP sunucusu olarak kullanın.
  • Şu anda bu uzantıları destekleyen tek sağlayıcı göründüğünden, SXG ile ilgili uzantılar içeren sertifikalar oluşturmak için DigiCert'i kullanıyorsanız.

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

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

SXG oluşturmak için CanSignHttpExchanges uzantısına sahip bir TLS sertifikasının yanı sıra belirli bir anahtar türüne ihtiyacınız vardır. DigiCert, bu uzantıyla sertifikalar sağlar. Bir sertifikanın verilmesi için bir CSR dosyasına ihtiyacınız vardır, bu nedenle aşağıdaki komutlarla bu 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ğıdakine benzer 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ü geçmez.
  • Ek Sertifika Seçenekleri altında bulunan CanSignHttpExchanges uzantısını sertifikaya ekle onay kutusu etkindir.
CanSignHttpExchanges uzantısını sertifikaya ekle onay kutusu.

Sertifikanız bu koşullarla eşleşmezse tarayıcılar ve dağıtımcılar 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ılmaktadır.

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

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

Bu rehber libsxg dilini kullanmaktadır.

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

OpenSSL (libssl-dev) sürümü eşleştiği sürece paketi her zamanki Debian yöntemini 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 öğesini manuel olarak oluşturma

.deb dosyalarıyla uyumlu bir ortam kullanmıyorsanız libsxg dosyasını 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ükleme

nginx için SXG modülü GitHub'da dağıtılmıştır. Debian tabanlı sistemlerde, ikili program paketi 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ün derlenmesi 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. Sisteminizde herhangi bir yere nginx yükleyin, ardından ilgili module/config/log/pidfile yolunu belirtin. Bu kılavuzda, /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 yayınlamak için HTTPS gerekir. DigiCert, Let's Encrypt ve diğer hizmetlerden SSL/TLS sertifikası alabilirsiniz. SSL için SXG sertifikası kullanamadığınızı veya SSL için SXG sertifikasını kullanamayacağınızı unutmayın. Bu nedenle, iki sertifikaya ihtiyacınız olacaktır. SSL anahtar/sertifika çiftini /path/to/ssl/ ve SXG anahtar/sertifika çiftini /path/to/sxg/ listesine eklediğiniz varsayıldığında, /etc/nginx/nginx.conf içindeki 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 düzgün bir şekilde yüklemesi için gereklidir. Sertifika zinciri, cbor biçimindeki sertifika ve OCSP zımbalama bilgilerini içerir. Aynı kaynaktan cert.cbor dosyasını sunmanız gerekmediğini unutmayın. HTTPS'yi desteklediği sürece herhangi bir CDN'ler veya diğer statik dosya sunma hizmetleri aracılığıyla yayınlayabilirsiniz.
  • sxg_validitiy_url öğesinin, SXG-imza-başlık ile ilgili bilgileri sunması planlanmaktadır. Bir sayfa son SXG'den bu yana değiştirilmediyse SXG dosyasının tamamının indirilmesi teknik olarak gerekmez. Bu nedenle, yalnızca imza başlığı bilgilerini güncellemenin ağ trafiğini azaltması beklenir. Ancak ayrıntılar henüz uygulanmadı.

SXG hizmeti sunmaya hazır olmak için nginx kullanmaya başlayın.

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: Yerleşik bir nginx modülü yapılandırma

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

/opt/nginx altında yüklü nginx sisteminizi aşağıdaki örneğe benzeyecek ş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 uygulamasını 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 öğeniz bir ön HTTP (S) sunucusu olarak çalıştığı sürece rastgele web uygulaması arka uçları(Ruby on Rails, Django veya Express gibi) için SXG yapmak üzere uygulamalarınıza yönelik yukarı akış yönergeleri kullanabilirsiniz.

upstream app {
    server 127.0.0.1:8080;
}

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

6. Adım: Test etme

Sunulan SXG'lerin doğru olduğunu test etmek, hiçbir hatanın bildirilmediğinden emin olmak ve başlıklar ile gövdenin beklendiği gibi olduğunu doğrulamak için dump-İmzalı Değişim 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önderin

SXG üzerinde çalışan Chromium mühendisleri, webpackage-dev@chromium.org adresinden geri bildiriminizi öğrenmek için sabırsızlanıyor. Ayrıca spesifikasyon tartışmasına katılabilir veya ekibe hata bildirebilirsiniz. Geri bildiriminiz standartlaştırma sürecine çok yardımcı olacak ve uygulama sorunlarının çözülmesine yardımcı olacaktır. Teşekkürler!