2010-11-23 140 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"); 
    } 
} 

就是這樣。