feat: SSL 证书管家 —— 后台面板 + 专属角色 + 国内机放行
集成在 api.200181.xyz(同一个 Worker),国内机 writeapi.usj.cc 同步可用。 新增第三档后台角色 'ssl': - 只拿证书管家钥匙,看不到评论/文章/用户等模块 - 判定正着枚举放行(canManageSSL = admin|ssl),不用排除法, 免得以后新增角色静默获得私钥权限 - 鉴权只认 Bearer 会话,绝不走 isAdminRequest —— 后者有 Artalk 老客户端的 query 兜底,一旦进来的就是 TLS 私钥 数据(复用 RSS_KV,前缀 certkeeper:): - 凭据一条一键,避开 KV 读-改-写无事务导致的并发丢数据 - 私钥/AK-SK 一律 AES-GCM 密文(TOKEN_SECRET 经 PBKDF2 派生) - 列表接口只回显前 4 后 4 位,明文不进内存 - 配置读失败抛错而非返回空,避免一次保存覆盖线上配置 只读监控: - probeTls 走 cloudflare:sockets 拿证书正文,实现到期分级 与「库里记录 vs 线上实测」对比(match/mismatch/live-only/unreachable) - 到期提醒邮件(HTML 已转义) 国内机 editor-api: - identify 识别 ssl 角色;业务分支前白名单,ssl 只能碰 /health、 /admin/session、/admin/logout 与 /api/v2/ssl* - /api/v2/ssl* 反代放行 admin + ssl(RSS 仍是 admin-only) - posts.mjs 越权兜底方向修正:owns() 从「非 editor 即放行」改为 「只有 admin 不受限」,漏进来的 ssl 被当受限编辑而非管理员全放行 - createPost 显式拒绝非写作角色 验证:typecheck ✓ / selftest:ssl 117 项 ✓ / 浏览器 37 项 ✓
This commit is contained in:
1 parent
636b19d46d
commit
a7c90fe336
16 files changed
+2791
-59
No files matched your search
@@ -11,6 +11,7 @@ import * as U from './routes/user';
|
||||
import * as A from './routes/admin';
|
||||
import * as H from './routes/human';
|
||||
import * as E from './routes/editor';
|
||||
import * as S from './routes/ssl';
|
||||
|
||||
const router = new Router();
|
||||
|
||||
@@ -47,6 +48,17 @@ router.post('/editor/git/publish', E.publish);
|
||||
router.post('/editor/git/sync', E.sync);
|
||||
router.get('/editor/handoff', E.handoff);
|
||||
|
||||
// ---------------------------------------------------------------- SSL 证书管家
|
||||
// 与 artalk-cf 同一个 Worker,共用后台会话与 KV。鉴权在自己的模块里
|
||||
// (只认 Bearer 会话,放行 admin + ssl 两种角色),这里只负责挂路径。
|
||||
// ★ 必须挂在 /api/v2 下 —— /api/*(非 v2)已被 RSS 模块整个接走。
|
||||
for (const r of S.SSL_ROUTES) {
|
||||
if (r.method === 'GET') router.get(r.path, r.handler);
|
||||
else if (r.method === 'POST') router.post(r.path, r.handler);
|
||||
else if (r.method === 'PUT') router.put(r.path, r.handler);
|
||||
else router.del(r.path, r.handler);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------- 评论
|
||||
// ★ /comments/lookup 必须注册在 /comments/:id 之前 —— 路由按注册顺序匹配,
|
||||
// 两段路径下 `:id` 会把 "lookup" 吃掉。
|
||||
|
||||
Reference in new issue
Block a user