iris 应用层无法实现 https 加密,因其协议栈止于 http,tls 握手和加解密必须在底层网络 i/o 层完成;手动加密 body 仅为伪加密,明文仍可被 iris 进程读取、日志记录。

IRIS 框架本身不提供接口加密传输功能,它只是 InterSystems IRIS 数据库的内置 Web 服务运行时环境,所有 HTTP 层的加密必须由反向代理(如 Nginx)或 IRIS 自带的 Web Server 配置 TLS 实现。
为什么不能在 Iris 应用层做 HTTPS 加密
InterSystems IRIS 的 %CSP.REST 或 %SYS.Portal.Applications 等 Web 接口本质是运行在 IRIS 内置 HTTP 服务器(或通过 Apache/Nginx 代理)上的 CSP/REST 服务。它的协议栈止于 HTTP;TLS 握手和加解密发生在更底层——即网络 I/O 层,IRIS 应用代码无法介入 SSL/TLS 握手过程。
试图在业务逻辑中手动对 request.body 或 response.body 做 AES/RSA 加密,只会让接口变成“伪加密”:明文仍会在 TLS 握手前被 IRIS 进程读取、日志记录、审计捕获,且破坏标准 REST 语义,增加客户端适配成本。
正确启用 HTTPS 的两种方式
IRIS 支持两种主流 TLS 部署路径,选其一即可:
- 使用 IRIS 内置 Web Server + 自签名或正式证书:需在管理门户
System Administration → Security → SSL/TLS Configurations中创建配置,再在Web Gateway Configuration中绑定该 SSL 配置到对应 Web 应用 - 前置 Nginx 反向代理(推荐):IRIS 保持 HTTP 监听(如
57772),Nginx 开启ssl_certificate和ssl_certificate_key,将443流量反向代理至 IRIS,并设置proxy_set_header X-Forwarded-Proto https保证应用感知安全上下文
注意:若用内置 Web Server,证书必须导入 IRIS 的 %SYS 命名空间并以 %SYS.SSLConfig 类形式注册;直接放文件系统路径无效。
需要额外加密字段时怎么做
如果业务有合规要求(如 GDPR 字段级加密、医疗数据脱敏),应在数据持久化前加密,而非传输层:
- 用
$SYSTEM.Encryption.EncryptAES()对敏感字段加密后再存入全局变量或 SQL 表 - 避免在 REST 方法中调用
$SYSTEM.Encryption处理整个 request body——这会掩盖真实错误(比如 JSON 解析失败被吞成加密异常) - 密钥管理必须独立:不要硬编码在
%CSP.Page类里,建议通过%SYS.Journal.Key或外部 KMS(如 HashiCorp Vault)注入
例如,在 %CSP.REST 子类的 OnPreHTTP() 中仅校验 Authorization: Bearer,真正解密操作放在 DAO 层或 %Persistent 的 OnSave() 钩子中。
最易被忽略的是日志泄露风险:即使启用了 HTTPS,IRIS 默认会把完整请求参数记入 csp.log 和 messages.log。必须手动关闭敏感服务的日志记录,或重写 %SYS.Task.Log 行为——这点比选什么加密算法关键得多。











