我發現org.apache.cxf
軟件包對於我不必編寫自定義類並且能夠堅持基本界面非常有幫助。
爲實例,這種方法可能是:
- 使用
JAX-WS
或wsimport
客戶
- 使用
cxf
WSS4JOutInterceptor
帶有動態屬性
- 使用動態
CallbackHandler
類用於訪問密鑰庫
典型的(wsimport
'd)客戶端公共API可能會確定這樣的:
public class SomeServiceClient
{
public SomeService getSomeService(URL url)
{
SomeService_Service svc = new SomeService_Service();
SomeService someService = svc.getSomeServicePort();
Client client = ClientProxy.getClient(someService);
Endpoint cxfEP = client.getEndpoint();
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, "Signature");
outProps.put(WSHandlerConstants.USER, "foo");
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, SomeClientCallbackHandler.class.getName());
outProps.put(WSHandlerConstants.SIG_PROP_FILE, "client-sign.properties");
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
cxfEP.getOutInterceptors().add(wssOut);
return someService;
}
}
你能提供一些邏輯,以確定哪些WSHandlerConstants.USER
值傳遞,使用哪個PW_CALLBACK_CLASS
,並且要使用的SIG_PROP_FILE
。
屬性文件可能如下所示。你可以簡單地有多個文件可以選擇,或者在課堂上,你可能只是動態添加這些屬性:
# properties for accessing the java keystore using Merlin
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=bar
org.apache.ws.security.crypto.merlin.keystore.alias=foo
org.apache.ws.security.crypto.merlin.keystore.file=foobar.keystore
最後,您CallbackHandler
需要提供你的密鑰庫中確定的證書的別名密碼。這也可能有一些動態的邏輯。
public class SomeClientCallbackHandler implements CallbackHandler
{
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
{
for(Callback thisCallback : callbacks)
{
WSPasswordCallback pwcb = (WSPasswordCallback)thisCallback;
String user = pwcb.getIdentifier();
int usage = pwcb.getUsage();
if(usage == WSPasswordCallback.SIGNATURE)
{
if("foo".equals(user)) pwcb.setPassword("bar");
}
}
}
}
最後,沒有太多的工作要做到這一切「動態」來處理多個密鑰庫,而不是隻做一次工作。編碼你自己的'in'或'out'攔截器可能會更好。
這是橫貼在Apache CXF郵件列表上,並獲得更多的討論有:。HTTP ://www.mail-archive.com/[email protected]/msg29770.html – EpicVoyage