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.xml
)Policy
对象内的 RampartConfig
对象得到解决。
从配置文件构建 Policy
对象,然后遍历 Assertion
s,在其中找到 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>
然后用于签署请求消息的证书将自动用于加密响应消息
我正在将 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.xml
)Policy
对象内的 RampartConfig
对象得到解决。
从配置文件构建 Policy
对象,然后遍历 Assertion
s,在其中找到 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>
然后用于签署请求消息的证书将自动用于加密响应消息