背景与价值服务间通信需要双向认证与可追溯身份。结合mTLS、Issuer白名单与轮换窗口,可以在不中断的情况下安全更新证书。统一规范Issuer白名单与SAN校验:仅接受受控CA签发,主体与服务标识一致。有效期窗口:在新旧证书共存窗口内允许双签并逐步切换。通道凭证:携带额外的租户或角色信息用于授权与审计。核心实现证书与Issuer校验type Cert = { issuer: string; subject: string; notBefore: number; notAfter: number; san: string[] } const allowIssuers = new Set(['CN=Corp-CA','CN=Mesh-CA']) function timeNow(): number { return Date.now() } function certAllowed(c: Cert): boolean { if (!allowIssuers.has(c.issuer)) return false if (c.notBefore > timeNow() || c.notAfter < timeNow()) return false return c.san.some(s => s.startsWith('spiffe://') || s.startsWith('dns:')) } 轮换窗口策略type Pair = { current: Cert; next?: Cert; windowMs: number } function withinWindow(p: Pair): boolean { if (!p.next) return false const start = p.current.notAfter - p.windowMs return timeNow() >= start && timeNow() <= p.current.notAfter } function acceptCert(p: Pair, presented: Cert): boolean { if (certAllowed(presented)) return true if (withinWindow(p) && p.next && presented.subject === p.next.subject && allowIssuers.has(presented.issuer)) return true return false } 通道凭证校验type ChannelCred = { tenant: string; role: string } function validTenant(t: string): boolean { return /^[a-z0-9-]{3,32}$/.test(t) } function validRole(r: string): boolean { return /^[A-Z_]{3,32}$/.test(r) } function credAllowed(c: ChannelCred): boolean { return validTenant(c.tenant) && validRole(c.role) } 落地建议仅接受受控Issuer签发的证书,并校验SAN包含服务标识(如SPIFFE或DNS)。在轮换窗口内同时接受新旧证书,确保平滑切换并记录审计。在通道中携带租户与角色凭证,用于细粒度授权与追踪。验证清单Issuer是否命中白名单、有效期是否覆盖当前时间。SAN是否包含受控标识,主体是否匹配服务身份。轮换窗口策略是否生效并记录切换日志。

发表评论 取消回复