ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apereo CAS 属性释放策略:ReturnEncrypted 加密属性释放完整指南

Apereo CAS 属性释放策略:ReturnEncrypted 加密属性释放完整指南 后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载导读本文聚焦 Apereo CAS 中的ReturnEncrypted 属性释放策略ReturnEncryptedAttributeReleasePolicy它利用注册服务Registered Service的公钥对通过策略授权的全部属性逐一执行 RSA 加密并将密文以 Base64 编码后随票据校验响应返回给服务方用于保护cn、mail、sn等敏感身份属性在传输链路中的机密性。读完本文你将掌握如何在服务注册 JSON 中声明该策略、如何用 OpenSSL 生成配套的 RSA 密钥对、底层加解密调用链的工作原理以及该策略与属性定义仓库Attribute Definition Store的配合方式。一、策略定位与其他属性释放策略的关系在 Apereo CAS 的属性释放体系中ReturnEncryptedAttributeReleasePolicy是 Attribute-Release-Policies.md 文档中列出的标准策略之一其行为描述为Encrypt and encode all allowed attributes in base-64 using the assigned registered service public key.即使用注册服务上配置的公钥对所有允许释放allowed的属性进行加密并以 Base64 编码输出。这与ReturnAll全量返回、ReturnAllowed白名单返回等明文策略的本质区别在于返回给客户端的不再是属性明文而是 RSA 加密后的密文只有持有对应私钥的服务方才能解密还原。正如 Attribute-Release.md 所述CAS 默认支持加密某些敏感属性如 proxy-granting ticket 相关属性并采用每个服务一对密钥per-service key-pair的方式来加密敏感属性——ReturnEncrypted正是把这一机制显式化为可配置的属性释放策略。二、核心概念RegisteredServicePublicKeyImpl该策略依赖的密钥载体是RegisteredServicePublicKeyImpl位于 RegisteredServicePublicKeyImpl.java它实现RegisteredServicePublicKey接口包含两个关键字段location公钥资源的位置支持classpath:、file:、http(s):等 Spring Resource 前缀并且标注了ExpressionLanguageCapable即支持 SpEL 表达式解析如${cas.custom.property}形式的占位符algorithm密钥算法代码中通过StringUtils.defaultIfBlank(this.algorithm, RSA)处理缺省时默认 RSA。它通过PublicKeyFactoryBean见 PublicKeyFactoryBean.java加载密钥并初始化 CiphercreateInstance()从location资源读取公钥先尝试 PEM 格式解析失败后再按 DERX.509 编码读取因此 PEM/DER 两种公钥文件均可使用toCipher()基于公钥与算法初始化一个ENCRYPT_MODE的Cipher实例供后续属性加密直接使用。三、策略配置服务注册 JSON 完整示例在原文档中该策略的注册服务 JSON 配置如下已按仓库现状核对CasRegisteredService位于org.apereo.cas.services包{ class : org.apereo.cas.services.CasRegisteredService, serviceId : sample, name : sample, id : 100, attributeReleasePolicy : { class : org.apereo.cas.services.ReturnEncryptedAttributeReleasePolicy, allowedAttributes : [ java.util.ArrayList, [ cn, mail, sn ] ] }, publicKey : { class : org.apereo.cas.services.RegisteredServicePublicKeyImpl, location : classpath:public.key, algorithm : RSA } }配置要点配置段说明attributeReleasePolicy.class必须为org.apereo.cas.services.ReturnEncryptedAttributeReleasePolicyallowedAttributes采用带类型的 JSON 集合写法java.util.ArrayList列出允许加密释放的属性名如cn、mail、sn只有出现在此列表且主体principal确实解析出该属性时才会被加密输出publicKey.class必须为org.apereo.cas.services.RegisteredServicePublicKeyImplpublicKey.location公钥文件路径本例为classpath:public.key需把生成的公钥放入 classpath如src/main/resourcespublicKey.algorithm密钥算法默认RSA一般无需修改3.1 策略类实现要点策略类源码位于 ReturnEncryptedAttributeReleasePolicy.java继承自AbstractRegisteredServiceAttributeReleasePolicy并在类初始化时通过Security.addProvider(new BouncyCastleProvider())注册 BouncyCastle 安全提供者getAttributesInternal(...)委托给authorizeReleaseOfAllowedAttributes(...)determineRequestedAttributeDefinitions(...)直接返回allowedAttributes用于向属性解析层声明本策略需要哪些属性定义。3.2 加密执行流程源码级authorizeReleaseOfAllowedAttributes的执行顺序对应上述源码 L66-L98校验公钥从context.getRegisteredService().getPublicKey()取公钥若为null记录错误日志No public key is defined for service ...并返回空属性集合——不会放行任何明文初始化 Cipher调用publicKey.toCipher()若初始化失败如算法非法同样返回空集合属性过滤将解析到的属性放入大小写不敏感的TreeMap仅保留allowedAttributes中确实存在resolvedAttributes::containsKey的属性逐值加密对每个允许属性的每个值执行EncodingUtils.encodeBase64(cipher.doFinal(value.toString().getBytes(StandardCharsets.UTF_8)))即先对属性值的 UTF-8 字节做 RSA 加密再将密文做 Base64 编码输出结果以MapString, ListObject返回属性名不变、值为加密后的 Base64 字符串。由此可见该策略是全有或全无的只要公钥缺失或 Cipher 无法初始化所有属性一律不释放宁缺毋滥从机制上避免了明文旁路泄露。四、密钥生成OpenSSL 命令详解原文档给出了三组 OpenSSL 命令用于生成配套的 RSA 密钥对openssl genrsa -out private.key 1024 openssl rsa -pubout -in private.key -out public.key -inform PEM -outform DER openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt -in private.key -out private.p8逐条说明其作用与注意事项openssl genrsa -out private.key 1024生成 1024 位 RSA 私钥并写入private.keyPEM 格式。私钥必须妥善保管在服务方属性消费端仅用于解密 CAS 返回的密文属性。若安全要求更高可选用 2048/4096 位但需与服务方解密端兼容。openssl rsa -pubout -in private.key -out public.key -inform PEM -outform DER从私钥导出公钥输入为 PEM 格式输出为 DER 格式。该 DER 公钥文件即配置中publicKey.location指向的文件如classpath:public.key。由于PublicKeyFactoryBean优先尝试 PEM 解析、失败后回退 DER 读取见 PublicKeyFactoryBean.java L58-L65因此 DER 格式完全受支持。openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt -in private.key -out private.p8将 PEM 私钥转换为无加密-nocrypt的 PKCS#8 DER 格式私钥private.p8供服务方 Java 代码以PKCS8EncodedKeySpec加载还原私钥用于解密。密钥交换示意public.key部署在 CAS 服务端classpathprivate.key/private.p8由对接的应用方持有任何能向该服务证明身份的请求方只有使用私钥才能解读 CAS 返回的属性密文。五、服务方解密与验证5.1 测试用例中的验证口径仓库测试 ReturnEncryptedAttributeReleasePolicyTests.java 从三个维度验证了策略行为verifyNoPublicKey注册服务未配置公钥、或公钥location为空时policy.getAttributes(context)返回空集合verifyBadCipher公钥算法非法如BAD导致 Cipher 初始化失败时同样返回空集合verifyEncrypt使用classpath:keys/RSA1024Public.keyRSA 算法作为公钥、allowedAttributes [cn,uid,mail]时加密结果数量与允许属性数量一致即每个允许属性都被成功加密输出。测试中使用的公钥资源路径如classpath:keys/RSA1024Public.key可参见 RegisteredServiceTestUtils.java 与 RegisteredServicePublicKeyImplTests.java可作为生成密钥后如何放置与引用的参考样例。5.2 服务端解密流程对称操作示意对拿到密文属性的服务方而言还原流程与加密端严格对称用private.p8PKCS#8 DER 私钥构造PKCS8EncodedKeySpec经KeyFactory.getInstance(RSA)还原PrivateKeyCipher.getInstance(RSA)并以Cipher.DECRYPT_MODE初始化对每个属性值先做 Base64 解码Base64.getDecoder().decode(...)再cipher.doFinal(decoded)得到明文字节以UTF-8还原字符串即得到原始属性明文。六、与属性定义仓库Attribute Definition Store的配合原文档明确指出一个容易被忽略的关键特性Attributes authorized and allowed for release by this policy may not necessarily be available as resolved principal attributes and can be resolved on the fly dynamically using the attribute definition store.即允许释放的属性不一定非要预先存在于主体解析出的属性集合中。结合ReturnEncryptedAttributeReleasePolicy的determineRequestedAttributeDefinitions实现直接返回allowedAttributes见 ReturnEncryptedAttributeReleasePolicy.java L54-L57CAS 会把允许属性作为请求的属性定义传递给属性解析与定义层再由属性定义仓库按需**动态解析on the fly**这些属性——例如通过级联定义linked/derived attribute definitions从已有属性推导出新属性或从外部数据源LDAP、REST、JDBC 等按需拉取而无需预先出现在 principal 的原始属性列表中。属性定义仓库的详细配置方式参见 Attribute-Definitions.md。七、典型应用场景与注意事项适用场景服务方需要接收cn、mail、sn等敏感身份属性但担心属性在票据协议响应、中间缓存或日志链路中被明文截获服务方具备或愿意维护一对 RSA 密钥希望在协议层做到密文交付、密钥自持需要结合属性定义仓库按需派生属性并加密下发避免在主体上预置过多原始属性。注意事项与边界该策略只负责加密不负责签名服务方需自行确保证据链路的完整性校验如 TLSallowedAttributes之外、或主体中不存在的属性不会被加密返回公钥缺失/算法错误时策略直接返回空集合故障表现是属性全部缺失而非明文泄露排查时应优先检查服务注册中的publicKey配置密钥算法需与PublicKeyFactoryBean的读取逻辑一致PEM 与 DER 公钥均支持algorithm保持默认RSA即可私钥private.key/private.p8绝不能放入 CAS classpath 或服务注册 JSON仅公钥允许部署在服务端。八、快速排障清单现象可能原因排查方向返回属性为空注册服务未配置publicKey检查服务注册 JSON 是否包含publicKey块返回属性为空location指向的资源不存在或无法解析确认classpath:public.key文件确实在 classpath 中检查 SpEL 占位符是否可解析返回属性为空Cipher 初始化失败确认algorithm与密钥实际算法一致日志中会出现Unable to initialize cipher ...部分属性缺失属性不在allowedAttributes或主体未解析出该属性检查allowedAttributes列表或借助属性定义仓库按需解析见 Attribute-Definitions.md服务方解密失败密钥对不匹配或私钥格式不对确认使用同一私钥派生出的公钥私钥使用 PKCS#8 DER 格式private.p8总结ReturnEncryptedAttributeReleasePolicy为 Apereo CAS 的属性释放提供了一条加密交付路径通过 RegisteredServicePublicKeyImpl.java 承载每服务独立公钥由 PublicKeyFactoryBean.java 加载 PEM/DER 密钥并初始化加密 Cipher最终在 ReturnEncryptedAttributeReleasePolicy.java 中完成过滤允许属性 → RSA 加密 → Base64 编码的完整链路。配合 OpenSSL 三行命令生成密钥对、属性定义仓库动态解析属性即可在实战中构建一套端到端可验证的敏感属性加密释放方案。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS 属性释放策略ReturnAllAttributeReleasePolicy 完整指南Apereo CAS 属性释放策略ReturnAllAttributeReleasePolicy 完整指南 本指南基于 Apereo CAS 官方文档 Att后端认证鉴权单点登录Apereo CAS 属性释放策略ReturnEnvironmentAttributeReleasePolicy 实战指南Apereo CAS 属性释放策略ReturnEnvironmentAttributeReleasePolicy 实战指南 本文介绍 Apereo CAS 中后端认证鉴权单点登录基于 InsForge BaaS 构建 ML 实验追踪器Python CLI 与本地可视化仪表盘完整指南基于 InsForge BaaS 构建 ML 实验追踪器Python CLI 与本地可视化仪表盘完整指南 本篇技术指南以 InsForge 仓库中的官方示例应后端认证鉴权单点登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表