2010-11-23 105 views
7

我想使用Apache CXF和WSS4J签署Web服务请求。据我所知,我需要一个包含我想用于签名的证书的JKS商店。 需要能够使用Windows证书存储中的X.509证书。在签署Web服务请求时,应从商店中读取证书。 我知道如何访问商店并获得证书。但是我怎样才能用它来签名,而不是从我自己的JKS商店获得证书?Web服务安全和Windows证书

+0

证书不用于签名,密钥是。你有权访问私钥吗?在这种情况下,你可以签署一些东西。 – 2010-12-06 01:01:28

回答

1

KeyStore不一定是JKS之一。您可以编写自己的JCA提供程序并实现KeyStoreSpi,并让它访问Windows证书存储。

0

看看this,它解释了如何使用Windows密钥库。然后你必须配置CXF来使用该密钥库。

+0

如何告诉CXF使用该商店? – tobiasbayer 2010-12-03 10:43:03

+0

似乎没有任何好的方法来做到这一点。这里有一个使用Java-COM桥接的建议:http://objectmix.com/java/76948-accessing-certificates-windows-system-stores-java.html。这个答案表明你将陷入JNI地狱:https://lists.owasp.org/pipermail/owasp-webscarab/2010-October/001123.html – rtperson 2010-12-27 14:22:33

0

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

1)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"); 
    } 
} 

就是这样。