java - Apache Rampart WS-Security:一个客户端,多个服务实例
问题描述
我正在将 X.509 相互证书身份验证添加到项目中。这里的具体情况是一个客户端(比如说manager
)可以访问多个服务实例(servers
)。每个server
都有自己的证书。在客户端提供policy.xml
配置时,<encryptionUser>
应将其设置为存储在客户端信任库中的服务器别名证书。当只有一个时这不是问题,server
但当客户需要访问特定server
的、适当的server
的公钥应该用于加密,所以我需要从信任库中提供一个正确的别名。我正在考虑以编程方式更改每个请求的 Rampart 配置以设置特定的别名,但这看起来不是正确的方法。我在这里寻找一种标准方法,或者,也许是某种在policy.xml
我的客户(manager
's)Rampart 配置部分中配置它的方法,policy.xml
如下所示
<ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">
<ramp:userCertAlias>client</ramp:userCertAlias>
<!-- This should be dynamic -->
<ramp:encryptionUser>server</ramp:encryptionUser>
<ramp:passwordCallbackClass>PasswordProvider</ramp:passwordCallbackClass>
<ramp:signatureCrypto>
<ramp:crypto provider="MerlinCrypto"/>
</ramp:signatureCrypto>
<ramp:encryptionCrypto>
<ramp:crypto provider="MerlinCrypto"/>
</ramp:encryptionCrypto>
</ramp:RampartConfig>
解决方案
通过以编程方式将参数设置为已在对象内encryptionUser
解析和构建(从policy.xml
)对象解决了此问题。从配置文件构建对象,然后遍历s,在其中找到对象并设置属性。RampartConfig
Policy
Policy
Assertion
RamparConfig
String encrUser = "myEncrUser";
try (InputStream is = new FileInputStream("policy.xml")) {
OMXMLParserWrapper omBuilder = OMXMLBuilderFactory.createOMBuilder(is);
Policy policy = PolicyEngine.getPolicy(omBuilder.getDocumentElement());
for (Iterator<List<Assertion>> assrItr = policy.getAlternatives(); assrItr.hasNext(); ) {
List<Assertion> assr = assertionsIterator.next();
assr.stream().filter(RampartConfig.class::isInstance)
.findFirst().map(RampartConfig.class::cast)
.ifPresent(cfg -> cfg.setEncryptionUser(encrUser));
}
} catch (IOException e) {
// ...
}
这里的客户端应用程序需要为每个服务配置axis2客户端对象,但在我的情况下这很好。
推荐阅读
- c++ - 我如何决定 Boost Property Tree 使用的数据类型?
- apache-kafka - 偏移量的异步自动提交失败
- python - Pytorch BERT:形状错误的输入
- javascript - 如何在material-ui中自定义活动选项卡的字体大小
- ios - 将文件从音乐库导出到 Documents 目录 (Swift 5)
- ansible - 使用 ceph-ansible 和滚动更新 playbook 对 Ceph 集群进行次要版本更新
- kedro - 如何创建目录条目列表并将它们作为输入传递到 Kedro Pipeline
- javascript - 未捕获的类型错误:无法在 HTMLFormElement 处读取 null 的属性“值”。
- python-3.x - 为什么Python中关于子类的以下代码会抛出错误?
- mongodb - 在 mongoDB 中查找以 16:xx:xx 开头的集合中的元素