1. 应用系统SSO对接
标准Open API
  • 管理后台接口
    • 开发前必读
    • 身份管理
      • 用户
        • 校验账号是否存在
        • 人员查询接口
        • 创建账号
        • 用户封禁接口
        • 用户注销接口(当前浏览器登入的会话)
        • 验证用户token是否有效
        • 用户注销登录 (用户所有登入会话包括终端)
        • 批量用户注销登录(标准版本不支持)
        • 获取终端用户在线状态(v4.0.11.8版本及以上可用)
      • 组织架构
        • 从指定用户组中移除指定账号
        • 校验指定用户组中是否有某个账号
        • 添加账号到指定用户组
        • 部门查询接口
    • 应用管理
      • HTTP应用
        • 域名端口存在校验
        • 应用发布
        • 应用更新
        • 删除应用(v4.0.10.3以上)
        • 应用详情(v4.0.10.3以上)
        • 应用列表接口(v4.0.8.0以上)
      • 隧道网关
        • 获取用户sdp网关接入状态
        • 创建隧道应用(v4.0.10.3以上)
        • 更新隧道应用(v4.0.10.3以上)
        • 删除隧道应用(v4.0.10.3以上)
        • 查询隧道应用详情(v4.0.10.3以上)
        • 下线sdp隧道连接(v4.0.12.4以上)
      • 授权管理
        • 添加HTTP应用到指定授权组
        • 授权策略详情(v4.0.10.3以上)
        • 授权策略列表查询(v4.0.10.3以上)
        • 更新授权策略(v4.0.10.3以上)
        • 创建授权策略(v4.0.10.3以上)
    • 主机运维网关
      • 主机组列表
      • 授权主机(主机添加负责人)
    • 终端管理
      • 资产管理
        • (新)删除可信资产(适用版本:4.0.11.0及以上)
        • (新)添加可信资产(适用版本:4.0.11.0及以上)
        • (新)获取可信资产列表(适用版本:4.0.11.0及以上)
        • (旧)删除可信资产(适用版本:4.0.8.0~4.0.10.X)
        • (旧)添加可信资产(适用版本:4.0.8.0~4.0.10.X)
        • (旧)获取可信资产列表(适用版本:4.0.8.0~4.0.10.0X)
      • 终端
        • 客户端注销登录
        • 终端状态信息拉取(4.0.8.1及以上版本支持)
        • 终端状态信息推送接口(4.0.8.1及以上版本支持)
        • 终端推送升级(4.0.11.0以上版本)
    • 组件管理
      • HTTP应用网关
        • 修改网关模式(4.0.8.0及以上版本可用)
        • 网关列表
    • 身份输出
      • 开发必读
      • 用户
        • 用户全量拉取(4.0.8.0及以上版本支持)
        • 用户增量拉取(4.0.8.0及以上版本支持)
      • 组织架构
        • 组织机构增量拉取(4.0.8.0及以上版本支持)
        • 组织机构全量拉取(4.0.8.0及以上版本支持)
    • API接口同步
      • API同步
    • IP地址池
      • 创建IP地址池(v4.0.15.0及以上)
      • 更新IP地址池(v4.0.15.0及以上)
      • 删除IP地址池(v4.0.15.0及以上)
      • 获取IP地址池列表(v4.0.15.0及以上)
  • 应用系统SSO对接
    • 零信任平台 OAuth2.0 协议对接指南
    • 零信任平台Cas协议对接指南
    • 零信任平台JWT协议对接指南
    • 零信任平台简易 SSO 对接指南
  1. 应用系统SSO对接

零信任平台简易 SSO 对接指南

1. 概述#

什么是简易 SSO?#

简易 SSO 是零信任网关提供的一种轻量级单点登录方案。用户在零信任门户完成身份认证后,网关会自动向后端业务系统注入包含用户身份信息的 HTTP Header,业务系统通过校验这些 Header 实现免密登录。

与其他 SSO 方式的区别#

SSO 方式复杂度开发量适用场景
简易 SSO⭐极低内部应用、快速对接
OAuth 2.0⭐⭐⭐中等公开应用、需精细授权
SAML⭐⭐⭐⭐较高企业级跨域联邦认证
CAS⭐⭐⭐中等传统企业 CAS Server 已有场景

前置条件#

业务系统已在零信任管控平台注册
业务系统已被分配到网关并配置好回源地址
管控后台已开启 SSO 配置并选择 "简易 SSO" 模式
已获取 通信密钥(token_secret)

2. 架构原理#

整体流程#

                                       零信任网关
                                     ┌─────────────────┐
  ① 用户通过零信任门户                │  1. SSL 终止     │
     完成身份认证                     │  2. 身份校验     │
         │                           │  3. Header 注入  │
         ▼                           └───────┬─────────┘
  ┌──────────┐     ② 已认证请求         ③ 注入 SSO Header
  │ 用户浏览器 │ ──────────────────────► ─────────────────► ┌──────────┐
  └──────────┘  (经过网关)                                  │ 业务系统  │
                                                           └──────────┘
                                                           ④ 校验 Header
                                                           ⑤ 自动登录
                                                           ⑥ 建立会话

详细认证流程#

用户浏览器                 零信任网关                  业务系统后端
    │                          │                        │
    │  1. 访问应用域名          │                        │
    │ ─────────────────────►   │                        │
    │                          │                        │
    │  2. 未认证,跳转门户登录   │                        │
    │ ◄─────────────────────   │                        │
    │                          │                        │
    │  3. 用户完成门户认证      │                        │
    │ ─────────────────────►   │                        │
    │                          │                        │
    │  4. 建立信任会话          │                        │
    │ ◄─────────────────────   │                        │
    │                          │                        │
    │  5. 再次访问应用          │                        │
    │ ─────────────────────►   │                        │
    │                          │  6. 注入 SSO Header     │
    │                          │  转发给后端             │
    │                          │ ─────────────────────► │
    │                          │                        │ 7. 解析 Header
    │                          │                        │ 8. 校验签名
    │                          │                        │ 9. 校验可信 IP
    │                          │                        │ 10. 查找/创建用户
    │                          │                        │ 11. 建立本地会话
    │                          │  12. 返回响应           │
    │ ◄─────────────────────────────────────────────────│
    │                          │                        │
    │  13. 后续请求使用本地会话  │                        │
    │ ─────────────────────►   │ ─────────────────────► │ (会话优先,不走SSO)

推荐认证优先级#

业务系统应采用 多层认证降级 策略,推荐优先级如下:
优先级认证方式触发条件
1️⃣本地会话(JWT/Session)请求携带有效的会话凭证
2️⃣简易 SSO无本地会话且请求含 SSO Header
3️⃣其他认证方式API Key、LDAP 等
💡 关键设计:本地会话优先于 SSO。SSO 首次认证通过并建立本地会话后,后续请求走本地会话快速通道,不再重复校验 SSO Header,以减少性能开销。

3. 零信任网关侧配置#

3.1 管控后台操作步骤#

1.
登录零信任管控平台
2.
找到目标应用,进入 SSO 配置 标签页
3.
开启 SSO 配置 开关
4.
选择 简易 SSO 模式
5.
点击 生成密钥 获取通信密钥,或手动输入自定义密钥
6.
点击 保存

3.2 关键配置项#

配置项说明示例值
SSO 模式选择 简易 SSO简易 SSO
通信密钥用于 MD5 签名计算的共享密钥,两端必须完全一致(由平台自动生成)

3.3 网关注入的 HTTP Header#

启用简易 SSO 后,网关会在每个已认证请求中自动注入以下 Header:
Header 名称必传说明示例值
X-SSO-UID✅用户唯一标识(用户名)zhangsan
X-SSO-SIGN✅MD5 签名(用于防伪校验)3f4400901f1cf095dca6cd01a442ab20
X-SSO-RSR-IP✅网关代理 IP(来源 IP)192.168.1.100
X-SSO-MAIL❌用户邮箱(如有)zhangsan@example.com
X-SSO-CN❌用户中文名(URL 编码)%E5%BC%A0%E4%B8%89(张三)

4. 业务系统侧配置#

4.1 所需配置项#

业务系统需要配置以下参数(具体配置方式取决于业务系统的技术栈,如环境变量、配置文件等):
配置项必填类型说明
SSO_ENABLED✅bool总开关。设为 false 即可立即关闭 SSO(逃生机制)
SSO_TOKEN_SECRET✅string通信密钥,需与网关管控后台完全一致
SSO_TRUSTED_IPS✅string允许发送 SSO Header 的网关 IP 白名单,防止伪造

4.2 配置示例(以环境变量为例)#

4.3 可信 IP 配置示例#

⚠️ 重要:可信 IP 必须设置为零信任网关的实际回源 IP 地址。这是简易 SSO 安全性的核心保障——如果攻击者无法从可信 IP 发送请求,即使伪造了 SSO Header 也会被拒绝。

5. 签名算法详解#

5.1 算法说明#

简易 SSO 使用 MD5 签名 来确保 Header 未被篡改。签名由网关自动计算并注入,业务系统收到请求后使用相同算法重新计算并比对。

5.2 签名公式#

sign = MD5( URI + UID + RSR_IP + User-Agent + token_secret ).toLowerCase()
拼接规则:
按顺序依次 直接拼接(无分隔符):URI、X-SSO-UID、X-SSO-RSR-IP、User-Agent、token_secret
空字段跳过(不参与拼接)
对拼接后的字符串做 UTF-8 编码 后计算 MD5
最终结果转为 小写 十六进制字符串(32 位)

5.3 计算示例#

场景:用户 zhangsan 通过网关(IP: 192.168.1.100)访问 /api/user/profile
字段值
URI/api/user/profile
X-SSO-UIDzhangsan
X-SSO-RSR-IP192.168.1.100
User-AgentMozilla/5.0
token_secret01234567890123456789
拼接字符串(无分隔符直连):
/api/user/profilezhangsan192.168.1.100Mozilla/5.001234567890123456789
Python 验证(可直接复制运行):
💡 你可以直接运行上面的 Python 代码验证。如果你的实现得到相同的输出 740883728e11e55036904f4a4f99e63b,说明签名算法实现正确。

5.4 各语言签名校验参考#

以下所有示例使用同一组测试数据。正确实现应产生相同的签名值 740883728e11e55036904f4a4f99e63b。

Python#

Go#

JavaScript (Node.js)#

Java#

5.5 空字段跳过示例#

当某个字段为空时,该字段不参与签名拼接。例如当 RSR-IP 为空时:

6. 对接验证#

6.1 业务系统后端校验逻辑(伪代码)#

函数 handleRequest(request):

    # 1️⃣ 优先检查本地会话(JWT/Session)
    如果 request 包含有效的本地会话:
        返回 已认证用户

    # 2️⃣ 检查 SSO Header
    如果 SSO 功能已启用:
        uid  = request.headers["X-SSO-UID"]
        sign = request.headers["X-SSO-SIGN"]
        ip   = request.headers["X-SSO-RSR-IP"]

        如果 uid 和 sign 都不为空:
            # 校验可信 IP
            如果 ip 不在 SSO_TRUSTED_IPS 白名单中:
                返回 403 "来源 IP 不在可信列表中"

            # 校验 MD5 签名
            expected = MD5(request.path + uid + ip + request.userAgent + SSO_TOKEN_SECRET)
            如果 sign != expected:
                返回 403 "签名校验失败"

            # 查找或创建用户
            user = 数据库.查找(username == uid)
            如果 user 不存在:
                user = 数据库.创建新用户(username=uid, ...)

            # 建立本地会话(后续请求直接走本地会话,不再走 SSO)
            建立会话(user)
            返回 已认证用户

    # 3️⃣ 其他认证方式 ...
    返回 401 "未认证"

6.2 使用 curl 模拟验证#

对接完成后,可以在业务系统服务器上用以下命令手动验证。

步骤 1:计算测试签名#

步骤 2:携带 SSO Header 发送请求#

期望结果#

< HTTP/1.1 200 OK
{"username":"testuser","auth_source":"sso", ...}
✅ 看到 200 响应 + 用户信息就说明对接成功!

6.3 推荐验证场景#

#测试场景操作要点期望结果
1正常 SSO 认证(首次访问)携带完整、正确的 SSO Header200 + 建立会话
2本地会话优先(已有会话时)携带上一步返回的 Cookie/Token200(走本地会话)
3降级(无 SSO + 无会话)不携带任何认证信息401 未认证
4非可信 IPX-SSO-RSR-IP 设为非白名单IP403 拒绝
5错误签名X-SSO-SIGN 设为任意错误值403 拒绝
6用户被禁用管理后台禁用该用户后重试403 账号已禁用

6.4 自验签名算法#

在对接开发阶段,可使用以下标准测试向量验证您的签名实现是否正确:
字段值
URI/api/user/profile
UIDzhangsan
RSR-IP192.168.1.100
User-AgentMozilla/5.0
token_secret01234567890123456789
期望签名740883728e11e55036904f4a4f99e63b
如果您的实现计算出的签名与上述 期望签名 一致,说明算法正确。

7. 逃生机制#

⚠️ 逃生机制是保障系统可用性的最后一道防线。当 SSO 出现问题导致无法登录时,必须能够快速恢复访问。

7.1 一键关闭 SSO(最快捷)#

将 SSO_ENABLED 设为 false 并重启服务,即可立即关闭 SSO,切换回本地登录模式:
关闭后:
✅ 所有本地账号(用户名 + 密码)可正常登录
✅ API Key 等其他认证方式不受影响
❗ SSO 用户需管理员为其设置本地密码后方可登录

7.2 逃生场景一览#

场景影响应急操作
零信任网关宕机SSO 认证不可用关闭 SSO_ENABLED + 重启服务
通信密钥被意外更改所有 SSO 请求签名校验失败同步更新 SSO_TOKEN_SECRET
网关 IP 变更所有 SSO 请求被可信 IP 拦截更新 SSO_TRUSTED_IPS
SSO 用户被误删特定用户无法登录在管理后台重建用户
需要临时绕过 SSO 进行维护-关闭 SSO_ENABLED + 重启服务

7.3 保底管理员账号(强烈建议)#

🔑 始终保留至少一个本地管理员账号(非 SSO 用户),并确保该账号有密码。
这是在 SSO 完全不可用时的最终逃生手段。上线前务必确认:
1.
存在至少一个 role=admin 的本地账号
2.
该账号拥有有效的密码(可本地登录)
3.
该账号未被禁用

7.4 SSO 用户应急密码设置#

当 SSO 不可用时,管理员可以为 SSO 创建的用户临时设置本地密码,使其能通过本地登录方式恢复访问。具体操作方式取决于业务系统的用户管理功能:
方式一:通过管理后台 UI 手动为用户重置密码
方式二:通过数据库/命令行工具直接更新密码字段
方式三:提供 "SSO 用户批量启用本地密码" 的管理脚本(推荐预先准备)

8. 故障排查#

8.1 常见问题速查表#

问题现象可能原因排查方法
登录后返回 401 未认证SSO 功能未启用检查 SSO_ENABLED 配置
登录后返回 403 IP 不可信网关 IP 不在白名单中检查 SSO_TRUSTED_IPS 和实际 IP
登录后返回 403 签名校验失败通信密钥不一致对比两端 token_secret
用户名正确但无中文名X-SSO-CN Header 未传递检查网关 Header 注入配置
首次用户无邮箱信息X-SSO-MAIL Header 未传递检查网关 Header 注入配置
SSO 正常但刷新页面又弹登录框本地会话未正确建立检查 Cookie/Session 设置
通过门户能访问,直接访问域名无法登录绕过了网关直接访问后端确认浏览器访问的是网关域名

8.2 签名对比排查法#

当签名校验失败时,最有效的排查方式是手动复现签名计算:

8.3 排查注意事项#

要素常见陷阱
URI仅 URL 的 path 部分,不含域名和查询参数(如 /api/user/me)
User-Agent必须是完整字符串,不同浏览器/curl 版本差异大,注意完整复制
空字段空字段不参与拼接——确认拼接逻辑中正确跳过了空值
大小写最终签名必须转为小写后比较
编码所有字段使用 UTF-8 编码后再计算 MD5
无分隔符字段之间直接拼接,不插入任何分隔符

9. 安全注意事项#

9.1 简易 SSO 的安全模型#

简易 SSO 的安全性依赖以下三重保障:
┌─────────────────────────────────────────┐
│         第 1 层:网络隔离               │
│  后端仅接受来自可信 IP 的 SSO 请求      │
│  (SSO_TRUSTED_IPS 白名单)             │
├─────────────────────────────────────────┤
│         第 2 层:签名校验               │
│  MD5(URI+UID+IP+UA+Secret) 防篡改      │
│  密钥仅网关和业务系统知晓               │
├─────────────────────────────────────────┤
│         第 3 层:内网环境               │
│  简易 SSO 设计上假定运行在可控内网      │
│  外网攻击者无法直接触达后端             │
└─────────────────────────────────────────┘

9.2 安全建议#

项目建议
🔑 通信密钥使用随机生成的强密钥(≥32 字符),定期轮换
🌐 可信 IP严格限定为网关 IP,切勿设为 0.0.0.0/0
🔒 网络隔离后端服务不应直接暴露到公网,应仅通过网关访问
👤 管理员账号始终保留本地 admin 账号作为逃生通道
📝 审计日志记录每次 SSO 登录事件,定期检查异常登录
⏰ 密钥轮换建议每 3-6 个月更换通信密钥(两端同步更改 + 重启服务)

9.3 已知局限#

局限点说明
无时间戳/Nonce签名中不含时间因子,理论上存在重放攻击风险。安全性依赖可信 IP + 内网。
MD5 算法MD5 已不被视为密码学安全的哈希算法,但在签名校验场景中配合密钥仍可用。
User-Agent 参与签名不同浏览器的 UA 不同,签名也不同。这是防篡改设计,但调试时需注意。

10. FAQ#

Q1: SSO 用户首次登录后的角色和权限怎么设置?#

SSO 首次认证会自动创建用户,默认角色由业务系统决定(通常为普通用户)。管理员可在业务系统管理后台手动调整角色和权限。

Q2: 修改通信密钥会影响在线用户吗?#

已登录用户的本地会话在有效期内不受影响。密钥变更只影响新的 SSO 认证请求。建议在低峰期操作。

Q3: SSO 和本地登录可以同时使用吗?#

可以。两者是并行机制:
经过网关的请求 → 自动走 SSO 免密登录
直接访问后端的请求 → 走本地登录页面

Q4: 网关 IP 变了怎么办?#

更新 SSO_TRUSTED_IPS 为新 IP 并重启服务即可。建议预先使用 CIDR 格式(如 192.168.1.0/24)减少 IP 变更影响。

Q5: 如何禁止某个 SSO 用户登录?#

在业务系统管理后台将该用户状态设为 禁用 即可。即使 SSO Header 校验通过,被禁用的账号也会收到 403 错误。

Q6: SSO 用户的姓名和邮箱能自动同步吗?#

取决于业务系统实现。推荐在每次 SSO 认证时检查 X-SSO-MAIL 和 X-SSO-CN Header,若有变化则自动更新本地用户信息。

Q7: 如何区分用户是通过 SSO 还是本地登录的?#

建议在用户表中增加 auth_source 字段,SSO 创建的用户标记为 sso,本地注册的用户标记为 local。

附录:上线 Checklist#

用于对接上线前的最终确认:
零信任管控后台已开启 SSO 配置并选择 简易 SSO
零信任管控后台已生成或配置 通信密钥
业务系统 SSO_ENABLED 已设为 true
业务系统 SSO_TOKEN_SECRET 与网关侧一致
业务系统 SSO_TRUSTED_IPS 设为网关的实际回源 IP
已重启业务系统服务
已保留至少一个本地管理员账号(含密码,非 SSO 用户)
已验证:SSO 正常认证(200)
已验证:非可信 IP 被拒绝(403)
已验证:错误签名被拒绝(403)
已验证:无认证信息时降级到本地登录(401)
已验证:浏览器通过网关域名可正常免密登录
已验证:直接访问后端 IP 时展示本地登录页面

文档版本: v4.0 | 最后更新: 2026-03-11
修改于 2026-03-12 05:51:47
上一页
零信任平台JWT协议对接指南
Built with