首页 > 解决方案 > 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>

标签: javasoapmutual-authenticationwss4jrampart

解决方案


通过以编程方式将参数设置为已在对象内encryptionUser解析和构建(从policy.xml)对象解决了此问题。从配置文件构建对象,然后遍历s,在其中找到对象并设置属性。RampartConfigPolicyPolicyAssertionRamparConfig

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客户端对象,但在我的情况下这很好。


推荐阅读