我要签名使用Apache CXF和WSS4J web服务请求。据我所知,我需要一个JKS存储包含我想使用签名的证书。 有能够从Windows证书存储区使用X.509证书的要求。证书应从商店在签署Web服务请求时被读取。 我知道如何访问存储并拿到证书。但我怎么可以用它从我自己的JKS库,而不是签署证书?

有帮助吗?

解决方案

密钥库不必是JKS一个。你可能会写自己的JCA提供者和执行KeyStoreSpi,并将其访问Windows证书存储区。

其他提示

这个说明如何使用Windows密钥库。然后,你必须CXF配置为使用密钥库。

刚刚发现这是可能的使用MerlinDevice类来实现。 这就是如何做:

一)WSS4JOutInterceptor配置属性:

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);

2)client_sign.properties文件看起来像这样:

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

3)又StupidCallback只是返回恒定字符串作为密码(其值并不重要):

public class StupidCallback implements CallbackHandler
{
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
    {
        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        pc.setPassword("password");
    }
}

这是所有。。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top