Перейти к основному содержимому

Регистрация публичного ключа 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.

HTTPCodeЗначение
400validation.failedНевалидный body или public JWK, включая запрещённый private material
401relay.enrollment_invalidToken не соответствует точному Tenant/Gateway enrollment
403relay.forbiddenEnrollment истёк или state Gateway запрещает регистрацию
409relay.conflictToken уже consumed, ключ конфликтует или выиграл concurrent запрос
413validation.failedBody больше 4096 байт
415validation.failedContent type не JSON
503relay.unavailableStored 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 и обзор безопасности.