Add complimentary OOBE polish and configurable admin mTLS
CI / verify (push) Has been cancelled
CI / publish (push) Has been cancelled

Allow one server-audited onboarding polish request without credits and make the certificate gate temporarily reversible while preserving application authentication.
This commit is contained in:
Rocky
2026-08-20 17:05:35 +08:00
parent 0b4acb5978
commit 034a3e8745
25 changed files with 698 additions and 64 deletions
+24 -6
View File
@@ -2,8 +2,21 @@
`account.osglab.com` 在同一个 TLS `server` 中同时承载移动端 API 和管理端。
由于 TLS 握手发生在 HTTP 路径匹配之前,配置必须使用 server 级
`ssl_verify_client optional`:普通客户端不提供证书时仍可正常访问,只有
`/admin``/admin/``/v1/admin` 和其子路径要求验证成功。
`ssl_verify_client optional`:普通客户端不提供证书时仍可正常访问。OpenResty 会把实际
证书验证结果传给 Ktor`ADMIN_MTLS_REQUIRED=true`(默认值)时,`/admin``/admin/`
`/v1/admin` 和其子路径要求验证成功。
## 临时关闭
在 1Panel/Compose 环境中显式设置并重启应用:
```text
ADMIN_MTLS_REQUIRED=false
```
关闭后,管理端无需客户端证书,但登录仍要求用户名、密码和 TOTP,其他会话、CSRF、RBAC、
失败锁定、限流与审计规则保持不变。恢复时将该值改回 `true` 并重启应用。不要为了临时关闭
而删除客户端 CA、证书或轮换记录。
## CA 与证书
@@ -22,14 +35,15 @@
## 上游信任边界
OpenResty 在管理路径 `$ssl_client_verify = SUCCESS` 时向 Ktor 设置固定头
OpenResty 在管理路径 `$ssl_client_verify` 覆盖并转发证书验证结果。有效证书对应
```text
X-OSG-mTLS-Verified: SUCCESS
```
客户端传入的同名头会被覆盖;其他路径会删除该头。Ktor 只能把这个头作为“边缘已验证”
信号,不能信任客户端提供的证书相关头,也不能用 DN、CN 或证书正文做隐式授权。
无证书时该值为 `NONE`客户端传入的同名头会被覆盖;其他路径会删除该头。Ktor 只能把
OpenResty 写入的这个头作为“边缘已验证”信号,不能信任客户端提供的证书相关头,也不能用
DN、CN 或证书正文做隐式授权。
后端端口必须继续只监听 `127.0.0.1:18080`,否则攻击者可绕过边缘伪造该头。
mTLS 只证明客户端持有受信证书,管理接口仍应执行应用层身份认证、授权和审计。
@@ -52,7 +66,7 @@ ADMIN_BOOTSTRAP_ENABLED=true
## 验证
将测试域名解析到目标边缘后执行:
`ADMIN_MTLS_REQUIRED=true` 时,将测试域名解析到目标边缘后执行:
```sh
# 无证书:管理路径必须是 404。
@@ -74,6 +88,10 @@ curl -i -H 'X-OSG-mTLS-Verified: SUCCESS' \
还应使用由非管理 CA 签发或已过期的客户端证书确认返回 404,并在 Ktor 测试端点确认:
管理请求只收到固定值 `SUCCESS`,普通 API 不收到 `X-OSG-mTLS-Verified`
`ADMIN_MTLS_REQUIRED=false` 时,无证书访问 `/admin/` 应返回管理页面,
`/v1/admin/auth/session` 应返回匿名会话状态。伪造 `X-OSG-mTLS-Verified: SUCCESS` 不会
改变结果,因为 OpenResty 会将其覆盖为实际验证状态。
部署后可在受信设备运行不含登录凭据的自动验收:
```sh