← Privacy Pass / privacy-pass
Тестирование развертывания в продакшене
Это руководство описывает получение токена из вашего развертывания, управляемого Cloudflare. К этому моменту вы и Cloudflare уже совместно создали и настроили следующие компоненты. Используйте это руководство, чтобы убедиться, что развертывание полностью выдает и принимает токены.
На данный момент Privacy Pass не является продуктом самообслуживания: развертывание в продакшене выполняется в рамках управляемого сотрудничества с Cloudflare. Если вы просто хотите увидеть работу Privacy Pass без какой-либо настройки, обратитесь к Начало работы.
Свяжитесь с нами ↗ чтобы запросить доступ и получить конфигурацию своего издателя.
Перед началом работы
Что предоставляет Cloudflare:
- Конечная точка издателя (здесь она называется
https://your-issuer.example.com), где работает публичный издатель, соответствующий RFC 9578. - Публичная конечная точка каталога по адресу
/.well-known/private-token-issuer-directory. - A
/token-requestконечная точка.
Что должны обеспечить или настроить вы:
- Рабочий Attester, служба, которая проверяет ваше утверждение и после проверки Клиента передаёт слепой запрос токена Издателю. В развёртываниях Издателя от Cloudflare Клиент никогда не обращается к Издателю напрямую. Обычно Аттестатора эксплуатируете вы сами, чтобы роли оставались разделёнными, но Cloudflare может помочь его создать. См. cloudflare/privacypass-attester ↗ для реализации на Cloudflare Workers.
- Origin (веб-служба, приложение или сайт, к которому пытается получить доступ Клиент), настроенный на проверку токенов по открытому ключу издателя (или на предъявление токена Cloudflare на периферии сети).
- клиентский сертификат mTLS который ваш Аттестатор использует для аутентификации у издателя.
- клиентская библиотека для запуска протокола выдачи токенов. Среди доступных библиотек: TypeScript, Go и Rust.
Реализуйте Клиента с помощью библиотеки Privacy Pass для вашего стека:
- TypeScript, @cloudflare/privacypass-ts ↗
- Go, cloudflare/pat-go ↗ (эталонная реализация для экспериментального использования и проверки совместимости)
- Rust, raphaelrobert/privacypass ↗ (независимый аудит не проводился)
1. Обнаружение конфигурации издателя
Каждый эмитент публикует свою конфигурацию по стандартной конечной точке каталога. Эта конечная точка общедоступна, поэтому вы можете обратиться к ней, чтобы убедиться в доступности эмитента и получить его открытые ключи:
curl https://your-issuer.example.com/.well-known/private-token-issuer-directoryВ ответе перечислены конечная точка запроса токена и открытые ключи издателя. Тип токена 2 это Blind RSA:
{
"issuer-request-uri": "/token-request",
"token-keys": [
{
"token-type": 2,
"token-key": "<base64url-encoded public key>",
"not-before": 1700000000
}
]
}Это ключи, по которым ваш Источник будет проверять предъявляемые токены.
2. Запрос и предъявление токена
В этой схеме развертывания Клиент никогда не обращается к эмитенту напрямую. Получение токена представляет собой полный цикл через все четыре роли:
- Origin возвращает
WWW-Authenticateпроверка. - Клиент завершает аттестацию с ваш Аттестатор и отправляет ему слепой запрос токена.
- Attester проверяет Клиента, затем проходит аутентификацию у издателя (например, по mTLS) и передаёт запрос на
/token-requestконечная точка. - Издатель подписывает слепой запрос и возвращает его. Клиент снимает ослепление, чтобы получить готовый токен, а затем предъявляет его на Origin.
Origin Client Attester Issuer
│ │ │ │
│- TokenChallenge ─>│ │ │
│ │<=== Attestation ==>│ │
│ │ │── TokenRequest ─>│
│ │ │<─ TokenResponse ─│
│ │<── TokenResponse ──│ │
│<─ Request+Token -─│ [finalize token] │ │
│────- 200 OK ────->│ │ │В этом примере с использованием библиотеки TypeScript Клиент формирует запрос на слепой токен, затем отправляет его вашему Аттестатору, который перенаправляет его издателю и возвращает подписанный ответ:
import { publicVerif } from '@cloudflare/privacypass-ts';
const { BlindRSAMode, Client } = publicVerif;
// Declare your own sendToAttester transport — see the note below.
declare function sendToAttester(tokenRequest: Uint8Array): Promise<Uint8Array>;
// `tokenChallenge` comes from the Origin's WWW-Authenticate header.
// `issuerPublicKey` is the issuer's public key bytes (from the directory in Step 1).
const client = new Client(BlindRSAMode.PSS);
const tokenRequest = await client.createTokenRequest(tokenChallenge, issuerPublicKey);
// Send the blinded request to your Attester. It verifies the client, proxies the
// request to the issuer, and returns the issuer's signed token response.
const tokenResponseBytes = await sendToAttester(tokenRequest.serialize());
// Deserialize and unblind to recover the finalized token.
const tokenResponse = client.deserializeTokenResponse(tokenResponseBytes);
const token = await client.finalize(tokenResponse);Затем Клиент предъявляет токен, отправляя его Источнику в Authorization заголовка. Origin (или Cloudflare на периферии сети, подробнее см. Модели развертывания) проверяет подпись по открытому ключу издателя и отвечает 200 OK.
3. Проверка работы
Два признака подтверждают, что выдача и предъявление токенов работают полностью:
- Конечная точка каталога возвращает открытые ключи издателя
token-keys. - Предъявленный токен проверяется по открытому ключу издателя, и Origin возвращает
200 OK.
Чтобы убедиться, что конечная точка каталога доступна, можно использовать демонстрационный инструмент Privacy Pass ↗ чтобы получить каталог издателя.
Дополнительные материалы
- Протокол Privacy Pass: четыре роли, процесс выдачи и предъявления токена, а также слепые подписи, из которых получаются токены.
- Модели развертывания: кто выполняет каждую роль и какие есть модели развёртывания.
- cloudflare/privacypass-attester ↗: эталонная реализация Аттестатора (аттестация через Turnstile, проксирование запросов токена издателю).
- cloudflare/privacypass-issuer ↗: эталонная реализация Издателя (Workers, ротация ключей).