Commit f1dda3f
committed
refactor(agent-tunnel): JWT-only enrollment, drop server-side mint
DVLS holds the provisioner private key, the gateway holds the public key
and verifies statelessly. The gateway-side enrollment-string mint
endpoint was the wrong shape: it required the gateway to hold issuance
state (the in-memory `EnrollmentTokenStore`), which broke HA (a token
could only be redeemed against the specific gateway node that minted
it, and a restart silently invalidated unredeemed tokens).
This PR removes that path entirely. DVLS signs an enrollment JWT with
its `gateway.agent.enroll` scope; the agent presents the JWT as the
Bearer token on `POST /jet/tunnel/enroll`; the gateway verifies the
signature against the configured provisioner public key. No state on
the gateway, no per-node affinity, no restart hazards.
Companion changes:
- Token: rename `gateway.tunnel.enroll` to `gateway.agent.enroll` (the
scope governs agent management, not the tunnel transport). Add the
matching `gateway.agent.read` scope. Both extractors
(`AgentManagementReadAccess` / `WriteAccess`) accept the new scopes
alongside the existing `Wildcard` / `ConfigWrite` / `DiagnosticsRead`
for back-compat with callers that predate the rename.
- .NET utils: new `EnrollmentClaims` mirroring the Rust shape so DVLS
can sign the JWT directly via `TokenUtils.Sign`. Two new
`AccessScope` constants. Round-trip JSON tests for both. NuGet
bumped to 2026.4.27.1 parent 0475494 commit f1dda3f
10 files changed
Lines changed: 149 additions & 182 deletions
File tree
- crates/agent-tunnel/src
- devolutions-gateway/src
- api
- utils/dotnet
- Devolutions.Gateway.Utils.Tests
- Devolutions.Gateway.Utils
- src
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
15 | | - | |
16 | 14 | | |
17 | 15 | | |
18 | 16 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
20 | 19 | | |
21 | 20 | | |
22 | 21 | | |
| |||
33 | 32 | | |
34 | 33 | | |
35 | 34 | | |
36 | | - | |
37 | 35 | | |
38 | 36 | | |
39 | 37 | | |
| |||
45 | 43 | | |
46 | 44 | | |
47 | 45 | | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | 46 | | |
53 | 47 | | |
54 | 48 | | |
| |||
148 | 142 | | |
149 | 143 | | |
150 | 144 | | |
151 | | - | |
152 | 145 | | |
153 | 146 | | |
154 | 147 | | |
155 | 148 | | |
156 | 149 | | |
157 | | - | |
158 | 150 | | |
159 | 151 | | |
160 | 152 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
| |||
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
14 | | - | |
| 15 | + | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| |||
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
42 | | - | |
| 43 | + | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
| |||
96 | 97 | | |
97 | 98 | | |
98 | 99 | | |
99 | | - | |
100 | | - | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
101 | 106 | | |
102 | 107 | | |
103 | 108 | | |
| |||
135 | 140 | | |
136 | 141 | | |
137 | 142 | | |
138 | | - | |
139 | | - | |
140 | | - | |
| 143 | + | |
| 144 | + | |
141 | 145 | | |
142 | 146 | | |
143 | 147 | | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | | - | |
148 | | - | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
| |||
282 | 282 | | |
283 | 283 | | |
284 | 284 | | |
285 | | - | |
| 285 | + | |
286 | 286 | | |
287 | 287 | | |
288 | 288 | | |
| |||
334 | 334 | | |
335 | 335 | | |
336 | 336 | | |
337 | | - | |
| 337 | + | |
338 | 338 | | |
339 | 339 | | |
340 | 340 | | |
| |||
352 | 352 | | |
353 | 353 | | |
354 | 354 | | |
355 | | - | |
| 355 | + | |
356 | 356 | | |
357 | 357 | | |
358 | 358 | | |
| |||
369 | 369 | | |
370 | 370 | | |
371 | 371 | | |
372 | | - | |
| 372 | + | |
373 | 373 | | |
374 | 374 | | |
375 | 375 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
424 | 424 | | |
425 | 425 | | |
426 | 426 | | |
427 | | - | |
428 | | - | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
429 | 431 | | |
430 | 432 | | |
431 | | - | |
432 | | - | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
433 | 440 | | |
434 | 441 | | |
435 | 442 | | |
| |||
438 | 445 | | |
439 | 446 | | |
440 | 447 | | |
441 | | - | |
| 448 | + | |
442 | 449 | | |
443 | 450 | | |
444 | 451 | | |
| |||
454 | 461 | | |
455 | 462 | | |
456 | 463 | | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
457 | 468 | | |
458 | 469 | | |
459 | | - | |
460 | | - | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
461 | 474 | | |
462 | 475 | | |
463 | 476 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
472 | 472 | | |
473 | 473 | | |
474 | 474 | | |
475 | | - | |
476 | | - | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
477 | 479 | | |
478 | 480 | | |
479 | 481 | | |
| |||
499 | 501 | | |
500 | 502 | | |
501 | 503 | | |
502 | | - | |
| 504 | + | |
503 | 505 | | |
504 | 506 | | |
505 | 507 | | |
| |||
0 commit comments