Узнайте, как обслуживать подписанные обмены (SXG) с помощью Web Packager.
Подписанный обмен (SXG) — это механизм доставки, который позволяет аутентифицировать происхождение ресурса независимо от того, как он был доставлен. Следующие инструкции объясняют, как настроить подписанные обмены с помощью Web Packager . Инструкции включены как для самозаверяющих сертификатов, так и для сертификатов CanSignHttpExchanges
.
Обслуживание SXG с использованием самозаверяющего сертификата
Использование самозаверяющего сертификата для обслуживания SXG в основном используется в целях демонстрации и тестирования. SXG, подписанные самозаверяющим сертификатом, будут генерировать сообщения об ошибках в браузере при использовании вне сред тестирования и не должны передаваться сканерам.
Предварительные условия
Чтобы следовать этим инструкциям, вам необходимо, чтобы в вашей среде разработки были установлены openssl и Go .
Создать самозаверяющий сертификат
В этом разделе объясняется, как создать самозаверяющий сертификат, который можно использовать с подписанными обменами.
Инструкции
Сгенерируйте закрытый ключ.
openssl ecparam -out priv.key -name prime256v1 -genkey
Закрытый ключ будет сохранен в виде файла с именем
priv.key
.Создайте запрос на подпись сертификата (CSR).
openssl req -new -sha256 -key priv.key -out cert.csr -subj '/O=Web Packager Demo/CN=example.com'
Запрос на подпись сертификата — это блок закодированного текста, который передает информацию, необходимую для запроса сертификата у центра сертификации (ЦС) . Хотя вы не будете запрашивать сертификат у центра сертификации, создать запрос на подпись сертификата все равно необходимо.
Приведенная выше команда создает запрос на подпись сертификата для организации с именем
Web Packager Demo
с общим именемexample.com
. Общее имя должно представлять собой полное доменное имя сайта, содержащего контент, который вы хотите упаковать как SXG.В производственной настройке SXG это будет принадлежащий вам сайт. Однако в среде тестирования, подобной той, которая описана в этих инструкциях, это может быть любой сайт.
Создайте сертификат с расширением
CanSignHttpExchanges
.openssl x509 -req -days 90 -in cert.csr -signkey priv.key -out cert.pem -extfile <(echo -e "1.3.6.1.4.1.11129.2.1.22 = ASN1:NULL\nsubjectAltName=DNS:example.com")
Эта команда использует закрытый ключ и CSR, созданный на шагах 1 и 2, для создания файла сертификата
cert.pem
. Флаг-extfile
связывает сертификат с расширением сертификатаCanSignHttpExchanges
(1.3.6.1.4.1.11129.2.1.22
— это идентификатор объекта для расширенияCanSignHttpExchanges
). Кроме того, флаг-extfile
также определяетexample.com
как альтернативное имя субъекта .Если вам интересно содержимое
cert.pem
, вы можете просмотреть его с помощью следующей команды:openssl x509 -in cert.pem -noout -text
Вы закончили создание закрытых ключей и сертификатов. В следующем разделе вам понадобятся файлы
priv.key
иcert.pem
.
Настройте сервер Web Packager для тестирования.
Предварительные условия
Установите веб-упаковщик .
git clone https://github.com/google/webpackager.git
Создайте
webpkgserver
.cd webpackager/cmd/webpkgserver go build .
webpkgserver
— это специальный двоичный файл в проекте Web Packager.Убедитесь, что
webpkgserver
установлен правильно../webpkgserver --help
Эта команда должна возвращать информацию об использовании
webpkgserver
. Если это не сработает, первым шагом для устранения неполадок будет проверка правильности настройки GOPATH .
Инструкции
Перейдите в каталог
webpkgserver
(возможно, вы уже находитесь в этом каталоге).cd /path/to/cmd/webpkgserver
Создайте файл
webpkgsever.toml
, скопировав пример.cp ./webpkgserver.example.toml ./webpkgserver.toml
Этот файл содержит параметры конфигурации для
webpkgserver
.Откройте
webpkgserver.toml
в любом редакторе и внесите следующие изменения:- Измените строку
#AllowTestCert = false
наAllowTestCert = true
. - Измените строку
PEMFile = 'path/to/your.pem'
чтобы она отражала путь к созданному вами сертификату PEMcert.pem
. Не меняйте строку, в которой упоминаетсяTLS.PEMFile
— это другой вариант конфигурации. - Измените строку
KeyFile = 'priv.key'
, чтобы она отражала путь к созданному вами закрытому ключуpriv.key
. Не меняйте строку, в которой упоминаетсяTLS.KeyFile
— это другой вариант конфигурации. - Измените строку
#CertURLBase = '/webpkg/cert'
наCertURLBase = 'data:'
.CertURLBase
указывает место обслуживания сертификата SXG. Эта информация используется для установки параметраcert-url
в заголовкеSignature
SXG. В производственных средахCertURLBase
используется следующим образом:CertURLBase = 'https://mysite.com/'
. Однако для локального тестирования можно использоватьCertURLBase = 'data:'
чтобы указатьwebpkgserver
использовать URL-адрес данных для встраивания сертификата в полеcert-url
. Для локального тестирования это наиболее удобный способ предоставления сертификата SXG. - Измените строку
Domain = 'example.org'
, чтобы она отражала домен, для которого вы создали сертификат. Если вы дословно следовали инструкциям этой статьи, его следует изменить наexample.com
.webpkgserver
будет получать контент только из домена, указанного вwebpkgserver.toml
. Если вы попытаетесь получить страницы из другого домена без обновленияwebpkgserver.toml
, журналыwebpkgserver
покажут, чтоURL doesn't match the fetch targets
.
Необязательный
Если вы хотите включить или отключить предварительную загрузку подресурсов , актуальны следующие параметры конфигурации
webpkgserver.toml
:Чтобы иметь директивы вставки
webpkgserver
для предварительной загрузки подресурсов таблицы стилей и скриптов в виде SXG, измените строку#PreloadCSS = false
наPreloadCSS = true
. Кроме того, измените строку#PreloadJS = false
наPreloadJS = true
.В качестве альтернативы использованию этого параметра конфигурации вы можете вручную добавить заголовки
Link: rel="preload"
и теги<link rel="preload">
в HTML-код страницы.По умолчанию
webpkgserver
заменяет существующие теги<link rel="preload">
эквивалентными тегами<link>
, необходимыми для получения этого контента в формате SXG. При этомwebpkgserver
установит директивыallowed-alt-sxg
иheader-integrity
по мере необходимости — авторам HTML не нужно добавлять их вручную. Чтобы переопределить это поведение и сохранить существующие предварительные загрузки, отличные от SXG, измените#KeepNonSXGPreloads (default = false)
наKeepNonSXGPreloads = true
. Имейте в виду, что включение этой опции может сделать SXG неприемлемым для кэша Google SXG в соответствии с этими требованиями .
- Измените строку
Запустите
webpkgserver
../webpkgserver
Если сервер запустился успешно, вы должны увидеть следующие сообщения журнала:
shell Listening at 127.0.0.1:8080 Successfully retrieved valid OCSP. Writing to cache in /private/tmp/webpkg
Сообщения вашего журнала могут выглядеть немного иначе. В частности, каталог, который
webpkgserver
использует для кэширования сертификатов, зависит от операционной системы.Если вы не видите этих сообщений, первым шагом по устранению неполадок будет перепроверка файла
webpkgserver.toml
.Если вы обновляете
webpkgserver.toml
вам следует перезапуститьwebpkgserver
.Запустите Chrome с помощью следующей команды:
shell /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --user-data-dir=/tmp/udd \ --ignore-certificate-errors-spki-list=`openssl x509 -noout -pubkey -in cert.pem | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64`
Эта команда указывает Chrome игнорировать ошибки сертификата, связанные с
cert.pem
. Это позволяет тестировать SXG с использованием сертификата испытаний. Если Chrome запускается без этой команды, при проверке SXG в DevTools отобразитсяCertificate verification error: ERR_CERT_INVALID
.Примечание:
Возможно, вам придется настроить эту команду, чтобы она отражала расположение Chrome на вашем компьютере, а также расположение
cert.pem
. Если вы все сделали правильно, под адресной строкой должно появиться предупреждение. Предупреждение должно быть примерно таким:You are using an unsupported command-line flag: --ignore-certificate-errors-spki-list=9uxADcgc6/ho0mJLRMBcOjfBaN21k0sOInoMchr9CMY=.
Если предупреждение не содержит хэш-строки, вы неправильно указали местоположение сертификата SXG.
Откройте вкладку «Сеть DevTools», затем перейдите по следующему URL-адресу:
http://localhost:8080/priv/doc/https://example.com
.Это делает запрос к экземпляру
webpackager
работающему по адресуhttp://localhost:8080
, для SXG, содержащего содержимоеhttps://example.com
./priv/doc/
— это конечная точка API по умолчанию, используемаяwebpackager
.На вкладке «Сеть» перечислены следующие ресурсы:
- Ресурс типа
signed-exchange
. Это SXG. - Ресурс типа
cert-chain+cbor
. Это сертификат SXG. Сертификаты SXG должны использовать форматapplication/cert-chain+cbor
. - Ресурс типа
document
. Это контент, который был доставлен через SXG.
Если вы не видите эти ресурсы, попробуйте очистить кеш браузера, а затем перезагрузить
http://localhost:8080/priv/doc/https://example.com
.Нажмите вкладку «Предварительный просмотр» , чтобы просмотреть дополнительную информацию о подписанном обмене и его подписи.
- Ресурс типа
Обслуживание подписанных обменов с использованием сертификата CanSignHttpExchanges
Инструкции в этом разделе объясняют, как обслуживать SXG с помощью сертификата CanSignHttpExchanges
. Для производственного использования SXG требуется сертификат CanSignHttpExchanges
.
Для краткости эти инструкции написаны с учетом того, что вы понимаете концепции, обсуждаемые в разделе «Настройка подписанных обменов с использованием самозаверяющего сертификата» .
Предварительные условия
У вас есть сертификат
CanSignHttpExchanges
. На этой странице перечислены центры сертификации, предлагающие этот тип сертификата.Если у вас нет сертификата, вы можете настроить свой webpkgserver на автоматическое получение сертификатов из вашего центра сертификации. Вы можете следовать инструкциям о том, что происходит в
webpkgserver.toml
на этой странице .Хотя это и не является обязательным требованием, настоятельно рекомендуется запускать
webpkgserver
на пограничном сервере. Если вы не используете пограничный сервер, вам необходимо настроить параметрыTLS.PEMFile
иTLS.KeyFile
вwebpkgserver.toml
. По умолчаниюwebpkgserver
работает через HTTP. Однако сертификаты SXG должны предоставляться через HTTPS, чтобы браузер считал их действительными. НастройкаTLS.PEMFile
иTLS.KeyFile
позволяетwebpkgserver
использовать HTTPS и, следовательно, передавать сертификат SXG непосредственно в браузер.
Инструкции
Создайте файл PEM, объединив сертификат SXG вашего сайта и сертификат CA вашего сайта. Дополнительные инструкции по этому поводу можно найти здесь .
PEM — это формат файла, который обычно используется в качестве «контейнера» для хранения нескольких сертификатов.
Создайте новый файл
webpkgsever.toml
, скопировав пример.cp ./webpkgserver.example.toml ./webpkgserver.toml
Откройте
webpkgserver.toml
в любом редакторе и внесите следующие изменения:- Измените строку
PEMFile = cert.pem
чтобы она отражала расположение файла PEM, содержащего полную цепочку сертификатов. - Измените строку
KeyFile = 'priv.key'
чтобы отразить расположение закрытого ключа, соответствующего вашему PEM-файлу. - Измените строку
Domain = 'example.org'
чтобы она отражала ваш сайт. - (Необязательно) Чтобы
webpkgserver
автоматически обновлял сертификат SXG каждые 90 дней (45 дней для Google), настройте параметры в разделе[SXG.ACME]
файлаwebpkgserver.toml
. Этот параметр применим только к сайтам с настроенной учетной записью DigiCert или Google ACME.
- Измените строку
Настройте свой пограничный сервер для пересылки трафика на экземпляр
webpkgserver
.Существует два основных типа запросов, обрабатываемых
webpkgserver
: запросы на SXG (которые обслуживаются конечной точкой/priv/doc/
) и запросы на сертификат SXG (которые обслуживаются конечной точкой/webpkg/cert/
). Правила перезаписи URL-адресов для каждого из этих типов запросов незначительно различаются. Дополнительные сведения см. в разделе Работа за интерфейсным пограничным сервером .Примечание:
По умолчанию
webpkgserver
обслуживает сертификат SXG по адресу/webpkg/cert/$CERT_HASH
— например,/webpkg/cert/-0QmE0gvoedn92gtwI3s7On9zPevJGm5pn2RYhpZxgY
. Чтобы сгенерировать$CERT_HASH
, выполните следующую команду:shell openssl base64 -in cert.pem -d | openssl dgst -sha256 -binary | base64 | tr /+ _- | tr -d =