
OpenMed mTLS 与请求签名教程10 分钟构建零信任医疗 AI 服务【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmedOpenMed是一款本地优先的医疗 AI 项目提供临床 NER 实体识别与 HIPAA PII 去标识化支持 2,200 医疗模型、21 种语言100% 在设备端运行、患者数据永不离开你的网络。当你把它部署为 REST 服务时mTLS 双向认证与HMAC 请求签名就是构建零信任医疗 AI 服务的两道核心防线——本教程带你从概念到配置一次讲透 ️OpenMed 的脱敏与临床抽取全程在本地完成服务边界清晰安全层因此可以做得很薄也很严格为什么零信任需要 mTLS 请求签名零信任的核心假设是不默认信任任何调用方。OpenMed 为此提供了三层互补机制安全层回答的问题实现mTLS 双向认证这个工作负载是谁客户端证书 私有 CA 验证API Key / JWT 路由授权它能干什么身份映射到路由 scopeHMAC 请求签名请求被改过或重放吗HMAC-SHA256 签名 nonce 防重放三者职责不重叠mTLS 保护连接与身份签名保护完整性认证层负责应用授权。官方文档分别位于 docs/serving/mtls.md、docs/serving/request-signing.md 和 docs/serving/authentication.md。第一步启用 OpenMed mTLS 双向认证最快配置方法mTLS 默认关闭只需环境变量即可启用无需修改任何应用代码OPENMED_SERVICE_MTLS_ENABLEDtrue \ OPENMED_SERVICE_MTLS_CA_BUNDLE/etc/openmed/client-ca.pem \ uvicorn openmed.service.app:app --host 127.0.0.1 --port 8080CA_BUNDLE指向你私有 CA 的证书文件不得包含生产私钥。OpenMed 会在应用边界对客户端证书链做二次验证——即使前置代理已验证过也绝不盲信。⚠️ 注意OpenMed 不在线执行 CRL / OCSP 检查证书签发与撤销基础设施由部署方自行负责。两种 TLS 终结位置怎么选方案 A在应用端直接终结 TLS。使用支持 ASGI TLS 扩展的服务器如 Uvicorn配置--ssl-cert-reqs 2要求客户端证书并把 CA 包传给服务器。若服务器不暴露客户端证书链OpenMed 会拒绝连接并返回mtls_certificate_required而不是降级放行。方案 B在 Sidecar / 入口网关终结。代理在 TLS 监听端要求并验证客户端证书后把叶子优先的 PEM 证书链 URL 转义放进专用头如X-OpenMed-Client-Cert转发给 OpenMed。配套要求代理必须删除客户端自己提交的同名头防止伪造只有来自受信任代理地址OPENMED_SERVICE_MTLS_TRUSTED_PROXIES的请求才被采信OpenMed 会独立地用 CA 包再验证一遍转发的证书链。把证书映射到身份与权限零信任的关键一步验证通过的证书细节会暴露在request.state.mtls_identity中包含subjectRFC 4514 DN、sans如uri:spiffe://openmed.test/clinic-api、fingerprint_sha256。推荐用SPIFFE URI 形式的 SAN做精确映射把证书绑定到稳定的非 PHI 服务身份和路由 scopeOPENMED_SERVICE_MTLS_PRINCIPALS[ { identities: [uri:spiffe://clinic.example/workload/openmed-client], principal: clinic-api, scopes: [analyze:write, pii:read, pii:write, models:read] } ]若没有任何映射命中OpenMed 会回退为mtls:sha256指纹身份且不授予任何 scope——认证通过但绝不静默放行权限。这是零信任默认拒绝原则的典型体现。第二步配置 HMAC 请求签名防重放完整流程OpenMed 内置一套 HMAC-SHA256 请求签名方案openmed/service/signing.py提供请求完整性与重放保护。每个签名请求只带三个头请求头含义X-OpenMed-TimestampUnix 时间整秒默认 300 秒新鲜度窗口X-OpenMed-Nonce每请求唯一的随机数X-OpenMed-Signaturesha25664 位小写十六进制摘要签名对象是 V1 规范字符串UTF-8、换行分隔方法、精确路径与查询、时间戳、nonce以及请求体的 SHA-256 哈希——注意放入的是 body 的哈希而不是 body 本身因此原始 PHI 永远不会被复制进签名或重放缓存状态隐私安全直接内置于协议设计中。客户端只需把请求体序列化一次、签名这同一份字节、再原样发出from openmed.service.signing import sign_request body json.dumps(payload, separators(,, :), sort_keysTrue).encode(utf-8) headers sign_request(POST, /jobs, body, secretos.environ[OPENMED_HMAC_SECRET])验证方为每个共享密钥域维护一个 nonce 缓存验证顺序是先查新鲜度与 HMAC再原子消费 nonce方法、路径、时间戳、nonce 或 body 被篡改 → 直接失败不占用缓存空间成功的请求消费其 nonce同一请求重放会被正确判定为 replay缓存达到上限时失败关闭NonceCacheFullError而不是悄悄丢弃记录。 请求签名是应用层完整性检查不替代 HTTPS、服务认证与密钥管理三者要同时保留。异步任务 Webhook 复用同一签名方案OpenMed 的异步脱敏任务POST /jobs完成时会向你的回调 URL 发送签名 webhook使用与上述完全相同的规范字符串方案方法恒为POST接收方可以直接把回调请求交给verify_request_signature校验。webhook 载荷本身不含任何原始 PHI。批量吞吐参考官方基准数据详见 docs/serving/async-jobs.md。mTLS 与 JWT / API Key 组合双层零信任mTLS 负责连接与身份REST 认证仍独立可配OPENMED_SERVICE_AUTH_ENABLEDtrue显式的 JWT 或 API Key 在路由授权中优先mtls_identity则继续标识持证书的工作负载。想强制普通应用路由必须持有 JWT只需保持 mTLS 身份不授予任何路由 scope 即可——TLS 证书在 JWT 校验之前依然强制。详见 docs/serving/authentication.md。PHI 日志安全mTLS 内置的红线OpenMed 明确规定客户端证书 PEM、subject、SANs、指纹永不写入访问日志成功的 mTLS 请求只在日志里留下映射后的 principal 和credential_typemtls。配套要求证书里只放机器/工作负载身份绝不要把患者姓名、病历号等 PHI 写进证书 subject、SAN 或映射配置。签名侧同理错误响应体不回显请求文本。零信任医疗 AI 服务部署清单✅ 私有 CA 签发客户端证书mTLS 启用并映射 SPIFFE 身份与 scope✅OPENMED_SERVICE_AUTH_ENABLEDtrueAPI Key 仅存 SHA-256 哈希默认拒绝DENY_BY_DEFAULT✅ HMAC 签名开启时钟 NTP 同步nonce 缓存按峰值调大max_entries✅ HMAC 密钥、CA 私钥交给密钥管理器托管参考 docs/security/secret-handling.md✅ 自建证书撤销/轮换流程OpenMed 不做在线 CRL/OCSP✅ 认证失败尝试受进程内速率限制防暴力破解✅ 多实例部署需外部 nonce 存储实现跨进程防重放写在最后OpenMed 的 mTLS 与请求签名设计有两个值得记住的默认值mTLS 默认关闭、应用层拒绝未知来源——这让你本地开发零摩擦而把安全完全交给显式配置。按本教程走完上面两步你就拥有了一条 mTLS 验身份、JWT/Key 控权限、HMAC 保完整的零信任链路医疗数据始终留在你的网络内。更多安全主题可继续参阅 docs/security/key-management.md 与 docs/serving/mtls.md。【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考