Hier erfahren Sie, wie Sie ein TLS-Zertifikat mit SXG-Erweiterungen generieren, Tools zum Generieren von SXG-Dateien installieren und nginx so konfigurieren, dass SXG-Dateien bereitgestellt werden.
Signed HTTP Exchanges (SXG) ist eine neue Webtechnologie, mit der Nutzer Creator von Inhaltsdistributoren leichter unterscheiden können. In dieser Anleitung erfahren Sie, wie Sie SXG einrichten.
Browserübergreifende Unterstützung
SXG wird von mehreren Chromium-basierten Browsern unterstützt, darunter Google Chrome, Samsung Internet und Microsoft Edge. Aktuelle Informationen finden Sie im Abschnitt „Konsens und Standardisierung“ des Artikels Von Ursprung signierte HTTP-Austausche.
Vorbereitung
Wenn du SXG auf deiner Website implementieren möchtest, musst du Folgendes tun:
- Sie haben die Kontrolle über Ihre Domain, einschließlich der DNS-Einträge.
- Zertifikate abrufen Für SXG ist die Ausstellung eines speziellen Zertifikats erforderlich. Insbesondere können Sie Ihren TLS-Schlüssel oder Ihr TLS-Zertifikat nicht wiederverwenden.
- Sie benötigen einen HTTP-Server, der SXG-Dateien über HTTPS generieren und bereitstellen kann.
Annahmen
In diesem Leitfaden wird davon ausgegangen, dass Sie Folgendes haben:
- Sie benötigen eine OpenSSL 1.1.1-Umgebung. Diese Anleitung wurde mit Ubuntu 18.04 LTS auf amd64 ISA geschrieben.
- Sie können
sudo
ausführen, um ausführbare Dateien zu installieren. - Verwenden Sie
nginx
als HTTP-Server. - Sie verwenden DigiCert, um Zertifikate mit SXG-bezogenen Erweiterungen zu generieren, da dies derzeit der einzige Anbieter ist, der diese Erweiterungen unterstützt.
Außerdem wird in den Beispielbefehlen in diesem Artikel davon ausgegangen, dass Ihre Domain website.test
lautet. Sie müssen website.test
also durch Ihre tatsächliche Domain ersetzen.
Schritt 1: Zertifikat für SXG abrufen
Zum Generieren von SXG-Dateien benötigen Sie ein TLS-Zertifikat mit der Erweiterung CanSignHttpExchanges
sowie einen bestimmten Schlüsseltyp.
DigiCert stellt Zertifikate mit dieser Erweiterung bereit.
Für die Ausstellung eines Zertifikats benötigen Sie eine CSR-Datei. Generieren Sie sie mit den folgenden Befehlen:
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"
Sie erhalten eine CSR-Datei, die so aussieht:
-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----
Prüfen Sie Folgendes:
- Die Gültigkeitsdauer darf 90 Tage nicht überschreiten.
- Das Kästchen CanSignHttpExchanges-Erweiterung in das Zertifikat aufnehmen ist unter „Zusätzliche Zertifikatoptionen“ aktiviert.
Wenn Ihr Zertifikat nicht diesen Bedingungen entspricht, lehnen Browser und Distributoren Ihr SXG aus Sicherheitsgründen ab.
In dieser Anleitung wird davon ausgegangen, dass der Dateiname des von DigiCert erhaltenen Zertifikats mySxg.pem
lautet.
Schritt 2: libsxg
installieren
Das SXG-Format ist komplex und ohne Tools nur schwer zu generieren. Sie haben folgende Möglichkeiten, SXG zu generieren:
- Das in Go geschriebene Tool gen-signedexchange
- Die in C geschriebene
libsxg
-Bibliothek
In diesem Leitfaden wird libsxg
verwendet.
Option 1: libsxg
über ein Debian-Paket installieren
Sie können das Paket auf die übliche Debian-Weise installieren, sofern die OpenSSL-Version (libssl-dev
) übereinstimmt.
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
Option 2: libsxg
manuell erstellen
Wenn Sie keine Umgebung verwenden, die mit .deb
-Dateien kompatibel ist, können Sie libsxg
selbst erstellen.
Als Voraussetzung müssen Sie git
, cmake
, openssl
und gcc
installieren.
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
Schritt 3: nginx
-Plug-in installieren
Mit dem nginx
-Plug-in können Sie SXG-Dateien dynamisch generieren, anstatt sie vor dem Ausliefern statisch zu generieren.
Option 1: Plug-in über ein Debian-Paket installieren
Das SXG-Modul für nginx
wird auf GitHub bereitgestellt.
Auf Debian-basierten Systemen können Sie es als Binärpaket installieren:
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
Option 2: Plug-in manuell erstellen
Zum Erstellen des nginx
-Moduls ist der nginx
-Quellcode erforderlich.
Du kannst den Tarball herunterladen und zusammen mit dem SXG-dynamischen Modul mit den folgenden Befehlen erstellen:
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
Die nginx
-Konfiguration ist sehr flexibel.
Installieren Sie nginx
an einer beliebigen Stelle in Ihrem System und geben Sie dann einen entsprechenden Pfad zu module/config/log/pidfile
an.
In diesem Leitfaden wird davon ausgegangen, dass Sie es unter /opt/nginx
installieren.
Schritt 4: nginx
-Plug-in für die Verwendung mit SXG konfigurieren
Option 1: Über Debian installiertes nginx
-Modul konfigurieren
Folgen Sie dieser Anleitung, wenn Sie zuvor Schritt 3, Option 1 verwendet haben.
Für die Bereitstellung von SXG-Inhalten ist HTTPS erforderlich. Sie können ein SSL/TLS-Zertifikat von DigiCert, Let's Encrypt und anderen Diensten erhalten. Sie können KEIN SXG-Zertifikat für SSL oder umgekehrt verwenden. Sie benötigen also zwei Zertifikate. Die Konfigurationsdatei in /etc/nginx/nginx.conf
sollte in etwa so aussehen, wenn Sie das SSL-Schlüssel/Zertifikat-Paar in /path/to/ssl/
und das SXG-Schlüssel/Zertifikat-Paar in /path/to/sxg/
abgelegt haben:
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
ist für die korrekte Ladung von SXG durch Browser unerlässlich, da damit die Zertifikatskette ermittelt wird. Die Zertifikatskette enthält Informationen zum Zertifikat und zum OCSP-Stapeln im CBOR-Format. Diecert.cbor
-Datei muss nicht von derselben Quelle aus bereitgestellt werden. Sie können sie über beliebige CDNs oder andere Dienste zum Bereitstellen statischer Dateien bereitstellen, sofern diese HTTPS unterstützen.sxg_validitiy_url
soll Informationen zum SXG-Signatur-Header enthalten. Wenn eine Seite seit der letzten SXG-Datei nicht geändert wurde, ist es technisch nicht erforderlich, die gesamte SXG-Datei herunterzuladen. Allein durch die Aktualisierung der Informationen im Signaturheader wird der Netzwerkverkehr voraussichtlich reduziert. Die Details sind jedoch noch nicht implementiert.
Starte nginx
und du kannst SXG-Dateien bereitstellen.
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)
Option 2: Ein aus der Quelle erstelltes nginx
-Modul konfigurieren
Folgen Sie dieser Anleitung, wenn Sie zuvor Schritt 3, Option 2 verwendet haben.
Konfigurieren Sie Ihr unter /opt/nginx
installiertes nginx
-System so, dass es in etwa so aussieht wie im folgenden Beispiel:
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;
}
}
Starten Sie dann nginx
. Jetzt kannst du dein SXG erhalten!
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)
Schritt 5: Anwendungs-Backend bereitstellen
In den obigen Beispielen dient nginx
zum Bereitstellen statischer Dateien im Stammverzeichnis. Sie können jedoch Upstream-Richtlinien für Ihre Anwendungen verwenden, um SXG für beliebige Webanwendungs-Back-Ends (z. B. Ruby on Rails, Django oder Express) zu erstellen, solange nginx
als HTTP(S)-Front-Server dient.
upstream app {
server 127.0.0.1:8080;
}
server {
location / {
proxy_pass http://app;
}
}
Schritt 6: Testen
Mit dem dump-signedexchange-Tool können Sie prüfen, ob die gesendeten SXGs korrekt sind, ob keine Fehler gemeldet werden und ob die Header und der Body wie erwartet sind.
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
Feedback geben
Die Chromium-Entwickler, die an SXG arbeiten, freuen sich über Ihr Feedback unter webpackage-dev@chromium.org. Sie können auch an der Diskussion zur Spezifikation teilnehmen oder dem Team einen Fehler melden. Ihr Feedback trägt wesentlich zum Standardisierungsprozess bei und hilft uns auch, Implementierungsprobleme zu beheben. Vielen Dank!