Apache Rampart WS-Security:一个客户端,多个服务实例

Apache Rampart WS-Security: one client, several service instances

我正在将 X.509 相互证书身份验证添加到项目中。这里的具体情况是一个客户端(假设 manager)可以访问多个服务实例(servers)。每个 server 都有自己的证书。在客户端提供 policy.xml 配置时,应将 <encryptionUser> 设置为存储在客户端信任库中的服务器别名证书。当 server 只有一个时这不是问题,但是当客户端需要访问特定的 server 时,应该使用适当的 server 的 public 密钥进行加密,所以我需要从信任库提供适当的别名。 我正在考虑在每个请求上以编程方式更改 Rampart 配置以设置特定的别名,但这看起来不是正确的方法。 我在这里寻找一种标准方法,或者也许是在 policy.xml 中进行配置的某种方法 我的客户 (manager's) 来自 policy.xml 的 Rampart 配置部分在下面

<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.xmlPolicy 对象内的 RampartConfig 对象得到解决。 从配置文件构建 Policy 对象,然后遍历 Assertions,在其中找到 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 客户端对象,但这对我来说很好。

如果您更换当前的加密用户

<ramp:encryptionUser>server</ramp:encryptionUser>

<ramp:encryptionUser>useReqSigCert</ramp:encryptionUser>

然后用于签署请求消息的证书将自动用于加密响应消息

Source