Как настроить подписанные HTTP-обмены (SXG) с помощью nginx

Как создать сертификат TLS с расширениями SXG, установить инструменты для создания файлов SXG и настроить nginx для обслуживания файлов SXG.

Хироки Кумадзаки
Hiroki Kumazaki

Подписанные обмены 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 в сертификат» , который находится в разделе «Дополнительные параметры сертификата».
Установите флажок Включить расширение CanSignHttpExchanges в сертификат .

Если ваш сертификат не соответствует этим условиям, браузеры и дистрибьюторы отклонят ваш SXG по соображениям безопасности. В этом руководстве предполагается, что имя файла сертификата, полученного от DigiCert, — mySxg.pem .

Шаг 2. Установите libsxg

Формат SXG сложен, и его трудно создать без использования инструментов. Вы можете использовать один из следующих вариантов для создания SXG:

В этом руководстве используется 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 . Вы также можете присоединиться к обсуждению спецификации или сообщить об ошибке команде. Ваши отзывы очень помогут процессу стандартизации, а также помогут решить проблемы реализации. Спасибо!