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