Jak wygenerować certyfikat TLS z rozszerzeniami SXG, zainstalować narzędzia do generowania plików SXG i skonfigurować nginx do obsługi plików SXG.
Podpisane wymiany HTTP (SXG) to nowa technologia internetowa, która ułatwia użytkownikom odróżnienie twórców treści od dystrybutorów treści. Z tego przewodnika dowiesz się, jak skonfigurować SXG.
Obsługa różnych przeglądarek
SXG obsługuje kilka przeglądarek opartych na Chromium, np. Google Chrome, Samsung Internet i Microsoft Edge. Bardziej aktualne informacje znajdziesz w sekcji „Konsensus i standaryzacja” na stronie Giełdy HTTP z podpisaniem źródła.
Wymagania wstępne
Aby wdrożyć SXG w swojej witrynie, musisz:
- mieć kontrolę nad domeną, w tym nad wpisami DNS;
- Uzyskaj certyfikaty. SXG wymaga wydania dedykowanego certyfikatu. W szczególności nie możesz ponownie użyć klucza ani certyfikatu TLS.
- mieć serwer HTTP, który może generować i udostępniać pliki SXG przez HTTPS;
Założenia
W tym przewodniku zakładamy, że:
- Mieć środowisko OpenSSL 1.1.1. Ten przewodnik został napisany w systemie Ubuntu 18.04 LTS w ramach standardu amd64 ISA.
- Mogą uruchamiać
sudo
, aby instalować pliki wykonywalne. - Używaj
nginx
jako serwera HTTP. - Korzystają z usługi DigiCert do generowania certyfikatów z rozszerzeniami związanymi z SXG, ponieważ obecnie jest to jedyny dostawca, który obsługuje te rozszerzenia.
Dodatkowo w przykładowych poleceniach w tym artykule założono, że Twoja domena to website.test
, więc website.test
musisz zastąpić swoją domeną.
Krok 1. Uzyskaj certyfikat SXG
Aby wygenerować SXG, potrzebujesz certyfikatu TLS z rozszerzeniem CanSignHttpExchanges
, a także określonego typu klucza.
DigiCert udostępnia certyfikaty z tym rozszerzeniem.
Do wydania certyfikatu potrzebny jest plik żądania podpisania certyfikatu, więc wygeneruj go za pomocą następujących poleceń:
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"
Zostanie wyświetlony plik żądania podpisania certyfikatu podobny do następującego:
-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----
Sprawdź, czy:
- Okres ważności nie przekracza 90 dni.
- Pole wyboru Uwzględnij w certyfikacie rozszerzenie CanSignHttpExchanges, które znajdziesz w sekcji Dodatkowe opcje certyfikatów.
Jeśli Twój certyfikat nie będzie spełniał tych warunków, przeglądarki i dystrybutorzy odrzuci SXG ze względów bezpieczeństwa.
W tym przewodniku przyjęto, że nazwa pliku certyfikatu otrzymanego z DigiCert to mySxg.pem
.
Krok 2. Zainstaluj aplikację libsxg
Format SXG jest skomplikowany i trudny do wygenerowania bez użycia narzędzi. Do generowania SXG możesz użyć jednej z tych opcji:
- Narzędzie gen-signedexchange napisane w języku Go.
- Biblioteka
libsxg
napisana w języku C.
W tym przewodniku jest używany język libsxg
.
Opcja 1. Zainstaluj aplikację libsxg
z pakietu Debiana
Możesz zainstalować ten pakiet w zwykły sposób na system Debian, o ile jest zgodna z wersją 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
Opcja 2. Utwórz libsxg
ręcznie
Jeśli nie używasz środowiska zgodnego z plikami .deb
, możesz samodzielnie utworzyć kompilację libsxg
.
Warunkiem wstępnym musisz zainstalować git
, cmake
, openssl
i 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
Krok 3. Zainstaluj wtyczkę nginx
Wtyczka nginx
umożliwia dynamiczne generowanie SXG zamiast ich statycznego generowania przed wyświetleniem.
Opcja 1. Zainstaluj wtyczkę z pakietu Debiana
Moduł SXG dla nginx
jest rozpowszechniany na GitHubie.
W systemach opartych na Debianie możesz zainstalować taki pakiet jako pakiet binarny:
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
Opcja 2. Utwórz wtyczkę ręcznie
Do kompilacji modułu nginx
potrzebny jest kod źródłowy nginx
.
Aby zbudować ją razem z modułem dynamicznym SXG, użyj tych poleceń:
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
Konfiguracja nginx
ma dużą elastyczność.
Zainstaluj nginx
w dowolnym miejscu w systemie, a następnie podaj odpowiednią ścieżkę module/config/log/pidfile
.
W tym przewodniku zakładamy, że musisz zainstalować ją w usłudze /opt/nginx
.
Krok 4. Skonfiguruj wtyczkę nginx
do pracy z SXG
Opcja 1. Skonfiguruj moduł nginx
zainstalowany z systemu Debian
Jeśli wcześniej korzystałeś z kroku 3, opcji 1, postępuj zgodnie z tymi instrukcjami.
Przesyłanie treści SXG wymaga protokołu HTTPS. Certyfikat SSL/TLS możesz uzyskać z usług DigiCert, Let's Encrypt oraz innych usług. Pamiętaj, że NIE MOŻNA używać certyfikatu SXG do obsługi protokołu SSL ani odwrotnie, dlatego potrzebujesz 2 certyfikatów. Plik konfiguracyjny w /etc/nginx/nginx.conf
powinien wyglądać mniej więcej tak jak poniżej (przy założeniu, że para klucz-certyfikat SSL została umieszczona w /path/to/ssl/
, a para klucz/certyfikat SXG w /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;
}
}
- Plik
sxg_cert_url
jest niezbędny do prawidłowego wczytywania SXG przez przeglądarki, ponieważ znajduje łańcuch certyfikatów. Łańcuch certyfikatów zawiera informacje o certyfikacie i zszaniu OCSP w formacie cbor. Pamiętaj, że nie musisz udostępniać plikucert.cbor
z tego samego źródła. Możesz go wyświetlać przez dowolną sieć CDN lub inne usługi statycznego wyświetlania plików, o ile obsługują protokół HTTPS. sxg_validitiy_url
będzie udostępniać informacje związane z nagłówkiem podpisu SXG. Jeśli strona nie została zmodyfikowana od czasu ostatniego SXG, pobranie całego pliku SXG nie jest wymagane technicznie. W związku z tym zaktualizowanie tylko informacji w nagłówku podpisu może ograniczyć ruch w sieci. Szczegóły nie zostały jeszcze wdrożone.
Jeśli uruchomisz grę nginx
, możesz wyświetlać reklamy 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)
Opcja 2. Skonfiguruj utworzony na podstawie źródła moduł nginx
Wykonaj te instrukcje, jeśli wcześniej zdarzyło Ci się korzystać z kroku 3, opcji 2.
Skonfiguruj system nginx
zainstalowany w systemie /opt/nginx
, aby wyglądał podobnie do tego przykładu:
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;
}
}
Następnie uruchom aplikację nginx
. Teraz możesz zdobyć 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)
Krok 5. Udostępnianie backendu aplikacji
W powyższych przykładach nginx
udostępnia pliki statyczne w katalogu głównym, ale możesz użyć instrukcji nadrzędnych dla aplikacji, aby utworzyć SXG na potrzeby dowolnych backendów aplikacji internetowych (takich jak Ruby on Rails, Django lub Express), o ile nginx
działa jako frontowy serwer HTTP(S).
upstream app {
server 127.0.0.1:8080;
}
server {
location / {
proxy_pass http://app;
}
}
Krok 6. Testowanie
Za pomocą narzędzia dump-Sign Exchange możesz sprawdzić, czy wyświetlane reklamy SXG są prawidłowe, czy nie zostaną zgłoszone żadne błędy, i sprawdź, czy nagłówki i treść są zgodne z oczekiwaniami.
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
Prześlij opinię
Inżynierowie Chromium pracujący nad SXG chętnie poznają Twoje opinie na adres webpackage-dev@chromium.org. Możesz też dołączyć do dyskusji na temat specyfikacji i zgłosić błąd zespołowi. Twoje uwagi bardzo pomogą w procesie standaryzacji i pomogą rozwiązać problemy z wdrażaniem. Dziękujemy!