Как создать сертификат TLS с расширениями SXG, установить инструменты для создания файлов SXG и настроить nginx для обслуживания файлов SXG.
Подписанные обмены HTTP (SXG) — это новая веб-технология, которая позволяет пользователям отличать создателей контента от распространителей контента. В этом руководстве показано, как настроить SXG.
Кроссбраузерная поддержка
Несколько браузеров на базе Chromium поддерживают SXG, включая Google Chrome, Samsung Internet и Microsoft Edge. Более актуальную информацию см. в разделе «Консенсус и стандартизация » HTTP-обменов с подписью источника .
Предварительные условия
Чтобы реализовать SXG на своем сайте, вам необходимо:
- Получите контроль над своим доменом, включая записи DNS.
- Получите сертификаты. SXG требует выдачи специального сертификата. В частности, вы не можете повторно использовать ключ или сертификат TLS.
- Имейте HTTP-сервер, который может генерировать и обслуживать SXG через HTTPS.
Предположения
В этом руководстве предполагается, что вы:
- Имейте среду OpenSSL 1.1.1. Это руководство было написано с использованием Ubuntu 18.04 LTS на amd64 ISA.
- Иметь возможность запускать
sudoдля установки исполняемых файлов. - Используйте
nginxв качестве HTTP-сервера. - Используете DigiCert для создания сертификатов, включающих расширения, связанные с SXG, поскольку в настоящее время он кажется единственным поставщиком, поддерживающим эти расширения.
Кроме того, в примерах команд в этой статье предполагается, что ваш домен — website.test , поэтому вам необходимо заменить website.test на свой фактический домен.
Шаг 1. Получите сертификат SXG.
Для создания SXG вам понадобится сертификат TLS с расширением CanSignHttpExchanges , а также определенный тип ключа. DigiCert предоставляет сертификаты с этим расширением. Для выдачи сертификата вам нужен файл CSR, поэтому сгенерируйте его с помощью следующих команд:
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"
Вы получите файл CSR, который выглядит следующим образом:
-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----
Убедитесь, что:
- Срок действия не превышает 90 дней.
- Установлен флажок «Включить расширение CanSignHttpExchanges в сертификат» , который находится в разделе «Дополнительные параметры сертификата».

Если ваш сертификат не соответствует этим условиям, браузеры и дистрибьюторы отклонят ваш SXG по соображениям безопасности. В этом руководстве предполагается, что имя файла сертификата, полученного от DigiCert, — mySxg.pem .
Шаг 2. Установите libsxg
Формат SXG сложен, и его трудно создать без использования инструментов. Вы можете использовать один из следующих вариантов для создания SXG:
- Инструмент gen-signedexchange, написанный на Go.
- Библиотека
libsxg, написанная на C.
В этом руководстве используется libsxg .
Вариант 1. Установите libsxg из пакета Debian.
Вы можете установить пакет обычным способом Debian, если версия 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
Вариант 2. Создайте libsxg вручную.
Если вы не используете среду, совместимую с файлами .deb , вы можете собрать libsxg самостоятельно. В качестве предварительного условия вам необходимо установить git , cmake , openssl и 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
Шаг 3. Установите плагин nginx
Плагин nginx позволяет генерировать SXG динамически, а не статически перед обслуживанием.
Вариант 1. Установите плагин из пакета Debian.
Модуль SXG для nginx распространяется на GitHub. В системах на базе Debian его можно установить как двоичный пакет:
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. Создайте плагин вручную.
Для сборки модуля nginx требуется исходный код nginx . Вы можете получить архив и собрать его вместе с динамическим модулем SXG, используя приведенные ниже команды:
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 обладает большой гибкостью. Установите nginx в любом месте вашей системы, затем укажите соответствующий путь в файле module/config/log/pidfile . В этом руководстве предполагается, что вы устанавливаете его в /opt/nginx .
Шаг 4. Настройте плагин nginx для работы с SXG.
Вариант 1. Настройка модуля nginx , установленного из Debian.
Следуйте этим инструкциям, если вы ранее использовали шаг 3, вариант 1 .
Для доставки контента SXG требуется HTTPS. Вы можете получить сертификат SSL/TLS от DigiCert, Let's Encrypt и других сервисов. Обратите внимание, что вы НЕ МОЖЕТЕ использовать сертификат SXG для SSL или наоборот, поэтому вам понадобятся два сертификата. Файл конфигурации в /etc/nginx/nginx.conf должен выглядеть примерно так, при условии, что вы поместили пару ключ/сертификат SSL в /path/to/ssl/ и пару ключ/сертификат SXG в /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;
}
}
-
sxg_cert_urlнеобходим браузерам для правильной загрузки SXG, поскольку он определяет цепочку сертификатов. Цепочка сертификатов содержит информацию о скреплении сертификатов и OCSP в формате cbor. Обратите внимание, что вам не обязательно предоставлять файлcert.cborиз того же источника. Вы можете обслуживать его через любые CDN или другие статические службы обслуживания файлов, если они поддерживают HTTPS. - Планируется, что
sxg_validitiy_urlбудет предоставлять информацию, связанную с заголовком SXG-подписи. Если страница не изменялась с момента последнего SXG, загрузка всего файла SXG технически не требуется. Таким образом, ожидается, что обновление только информации заголовка подписи уменьшит сетевой трафик. Но детали еще не реализованы.
Запустите nginx , и вы готовы обслуживать 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)
Вариант 2. Настройка модуля nginx , построенного из исходного кода.
Следуйте этим инструкциям, если вы ранее использовали шаг 3, вариант 2 .
Настройте свою систему nginx , установленную в /opt/nginx так, как показано в следующем примере:
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;
}
}
Затем запустите nginx . Теперь вы можете получить свой 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)
Шаг 5. Обслуживание серверной части вашего приложения
В приведенных выше примерах nginx обслуживает статические файлы в корневом каталоге, но вы можете использовать директивы восходящего потока для своих приложений, чтобы создать SXG для произвольных серверных частей веб-приложений (таких как Ruby on Rails, Django или Express), если ваш nginx работает как передний HTTP(S)-сервер.
upstream app {
server 127.0.0.1:8080;
}
server {
location / {
proxy_pass http://app;
}
}
Шаг 6: Тест
Используйте инструмент dump-signedexchange , чтобы проверить правильность обслуживаемых SXG, убедиться в отсутствии ошибок и убедиться, что заголовки и тело соответствуют ожиданиям.
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
Отправить отзыв
Инженеры Chromium, работающие над SXG, будут рады услышать ваши отзывы по адресу webpackage-dev@chromium.org . Вы также можете присоединиться к обсуждению спецификации или сообщить об ошибке команде. Ваши отзывы очень помогут процессу стандартизации, а также помогут решить проблемы реализации. Спасибо!