【问题标题】:Apache Rampart WS-Security: one client, several service instancesApache Rampart WS-Security:一个客户端,多个服务实例
【发布时间】:2021-02-09 06:07:33
【问题描述】:

我正在将 X.509 相互证书身份验证添加到项目中。这里的具体情况是一个客户端(比如说manager)可以访问多个服务实例(servers)。每个server 都有自己的证书。在客户端提供policy.xml 配置时,<encryptionUser> 应设置为存储在客户端信任库中的服务器别名证书。当server 只有一个时这不是问题,但是当客户端需要访问特定的server 时,应该使用适当的server 的公钥进行加密,所以我需要从信任库中提供一个正确的别名。 我正在考虑以编程方式更改每个请求的 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>

【问题讨论】:

    标签: java soap mutual-authentication wss4j rampart


    【解决方案1】:

    通过以编程方式将encryptionUser 参数设置为已解析并构建(来自policy.xmlRampartConfig 对象内的Policy 对象,解决了此问题。 从配置文件中构建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客户端对象,但在我的情况下这很好。

    【讨论】:

      【解决方案2】:

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

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

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

      那么用于签署请求消息的证书将被自动用于加密响应消息

      Source

      【讨论】:

      • 嗨@rekotc,感谢您的回答。 useReqSigCert 的使用确实适用于一台服务器多个客户端的方法。因此,当您将其设置为服务器的policy.xml 时,Rampart 使用来自客户端 SOAP 消息的签名来加密响应。但是当您有多个服务实例(具有多个身份证书)时它不起作用 - 至少我不知道如何仅使用配置来实现它:)
      • 嗨@sys463,你是对的,我误解了你的问题!现在我想问你一个更详细的解决方案来解决你的问题,因为我可能会发现自己处于这种情况......:D
      • 嗨@rekotc!我已经用一些代码示例更新了答案。这并不理想,但这就是我的想法:)
      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多