Регистрация публичного ключа Gateway
Во время bootstrap Edge License Gateway локально создаёт пару ES256 и оставляет private key на Host. В Cloud по outbound HTTPS отправляется только public JWK:
POST /api/v1/edge-gateways/{gatewayInstanceId}/signing-keys
Одноразовый enrollment token разрешает операцию только для точной связки Tenant и Gateway. Это не Product identifier, не License credential и не многоразовый API credential. Один Gateway позднее может обслуживать несколько Products; Product authority берётся из проверенных runtime snapshots, а не из запроса.
Запрос
Используйте Content-Type: application/json. Не отправляйте
Idempotency-Key: enrollment token расходуется один раз, а точный replay после
успеха возвращает 409.
{
"tenantId": "019c4400-0000-7000-8000-000000000001",
"enrollmentToken": "<one-time-enrollment-token>",
"publicSigningJwk": {
"kty": "EC",
"crv": "P-256",
"kid": "gateway-key-2026-01",
"use": "sig",
"alg": "ES256",
"x": "<base64url-encoded-32-byte-x-coordinate>",
"y": "<base64url-encoded-32-byte-y-coordinate>"
}
}
Body содержит ровно три показанных top-level поля и ограничен 4096 UTF-8 байтами. JWK содержит ровно семь показанных публичных полей. Unknown, duplicate, nested, malformed и non-canonical значения отклоняются. Никогда не добавляйте private scalar или PEM material и не логируйте enrollment token.
Успешный ответ
201 Created возвращает только безопасные данные public-key receipt:
{
"signingKeyId": "019c4400-0000-7000-8000-000000000010",
"gatewayInstanceId": "019c4400-0000-7000-8000-000000000009",
"keyId": "gateway-key-2026-01",
"publicKeyThumbprint": "<rfc-7638-sha256-base64url>",
"registeredAtUtc": "2026-08-07T16:30:00Z",
"supersededKeyId": null
}
Все ответы содержат Cache-Control: no-store и Pragma: no-cache.
Регистрация не активирует Gateway; выпуск Cloud trust document — отдельный шаг.
Ошибки и retry
Ошибки используют стандартный envelope code, message, correlationId и
никогда не возвращают Tenant, Gateway, token или key material.
| HTTP | Code | Значение |
|---|---|---|
400 | validation.failed | Невалидный body или public JWK, включая запрещённый private material |
401 | relay.enrollment_invalid | Token не соответствует точному Tenant/Gateway enrollment |
403 | relay.forbidden | Enrollment истёк или state Gateway запрещает регистрацию |
409 | relay.conflict | Token уже consumed, ключ конфликтует или выиграл concurrent запрос |
413 | validation.failed | Body больше 4096 байт |
415 | validation.failed | Content type не JSON |
503 | relay.unavailable | Stored registration state временно недоступен |
Validation failures происходят до consume token, поэтому исправленный запрос
может использовать тот же token. После timeout или 409 не повторяйте запрос
вслепую: первый запрос мог завершиться. Получите новый enrollment через
operator workflow. Повторяющийся 503 с correlation ID требует расследования
support.
Security boundary
- Создавайте и защищайте private key локально; Cloud принимает только public material.
- Используйте production TLS и outbound Host-to-Cloud connectivity. Cloud не открывает inbound connection к Host, а Host не подключается к Cloud RabbitMQ или Cloud database.
- Не используйте request config, Product codes или entitlements как identity.
- Полный Relay engine и внутренности Host остаются proprietary; эта страница описывает только поддерживаемый bootstrap wire contract.
См. также Local Relay и обзор безопасности.