我想使用Apache CXF和WSS4J签署Web服务请求。据我所知,我需要一个包含我想用于签名的证书的JKS商店。 需要能够使用Windows证书存储中的X.509证书。在签署Web服务请求时,应从商店读取证书。 我知道如何访问商店并获得证书。但是如何使用它来签名而不是我自己的JKS商店的证书?
答案 0 :(得分:1)
KeyStore不一定是JKS。您可以编写自己的JCA Provider并实现KeyStoreSpi,并让它访问Windows证书库。
答案 1 :(得分:0)
查看解释如何使用Windows密钥库的this。然后,您必须配置CXF以使用该密钥库。
答案 2 :(得分:0)
刚刚发现可以使用WSS4JOutInterceptor
类来实现。
这就是它的完成方式:
1)配置Map<String,Object> outProps = new HashMap<String,Object>();
outProps.put(WSHandlerConstants.ACTION, "Signature");
outProps.put(WSHandlerConstants.USER, "Friendly_name_of_your_certificate");
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, StupidCallback.class.getName());
outProps.put(WSHandlerConstants.SIG_PROP_FILE, "client_sign.properties");
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
的属性:
client_sign.properties
2)org.apache.ws.security.crypto.provider=org.apache.wss4j.common.crypto.MerlinDevice
keystore.provider=SunMSCAPI
cert.provider=SunMSCAPI
keystore.type=Windows-MY
truststore.type=Windows-ROOT
文件如下所示:
StupidCallback
3)public class StupidCallback implements CallbackHandler
{
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
{
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword("password");
}
}
只返回常量字符串作为密码(其值并不重要):
boolean rest = stt.execute("SHOW TABLES like 'bus' ");
这就是全部。