可以使用相同的技术来指定一个类而不是密码。
清单 8. 使用 WSIT 服务器端扩展签署并加密策略
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="SignEncr">
<wsp:ExactlyOne>
<wsp:All>
<sp:AsymmetricBinding xmlns:sp=
"http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:Policy>
...
</wsp:Policy>
</sp:AsymmetricBinding>
<sp:SignedParts
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<sp:Body/>
</sp:SignedParts>
<sp:EncryptedParts
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<sp:Body/>
</sp:EncryptedParts>
<wsss:KeyStore alias="serverkey"
keypass="com.sosnoski.ws.library.metro.KeystoreAccess"
location="server.keystore" storepass="nosecret"
xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy" wspp:visibility="private"
xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"/>
<wsss:TrustStore location="server.keystore" storepass="nosecret"
xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy" wspp:visibility="private"
xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
清单 9 展示了这个示例使用的 CallbackHandler 接口的实现:
清单 9. 服务器密匙存储密码回调代码
public class KeystoreAccess implements CallbackHandler
{
public void handle(
Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
Callback callback = callbacks[i];
if (callback instanceof PasswordCallback) {
((PasswordCallback)callback).setPassword("serverpass".toCharArray());
} else {
throw new UnsupportedCallbackException(callback, "unknown callback");
}
}
}
}
Java Web服务: Metro服务下的WS-Security(8)
时间:2011-07-25 IBM Dennis Sosnoski
构建并运行示例代码
签名与加密示例使用的 构建步骤 与 UsernameToken 示例相同,但是您必须修改 build.properties 文件以使用 variant-name=signencr(而不是 UsernameToken 示例使用的 username)。
互操作性问题
如果您使用 Axis2/Rampart 客户端与 Metro/WSIT 服务器(或者相反),当客户端尝试添加一本国际 标准书籍编号(International Standard Book Number,ISBN)相同的书时,您可能会遇到问题。在这种 情况下,服务器将返回一个 Fault,而不是通常的 SOAP 响应消息。Axis2/Rampart 1.5.x 发布版正确地 执行了 WSDL 在这里 |