2011-11-30 105 views
1

因此,我一直試圖使用JAX-WS和SSL來設置Java SOAP servlet。我得到了通過SSL運行的實際服務,但我需要它基於客戶端證書進行身份驗證,現在它正在接受針對它的所有連接。基於SSL和客戶端證書的Java SOAP服務

這裏是我到目前爲止的代碼:

TrustManager tm = new X509TrustManager() { 
public void checkClientTrusted(X509Certificate[] chain, 
       String authType) 
       throws CertificateException { 
    System.out.println("yay1"); 
} 



public void checkServerTrusted(X509Certificate[] chain, 
       String authType) 
       throws CertificateException { 
    System.out.println("yay2"); 
} 

public X509Certificate[] getAcceptedIssuers() { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 
}; 


String uri = "http://127.0.0.1:8083/SoapContext/SoapPort"; 
Object implementor = new Main(); 

Endpoint endpoint = Endpoint.create(implementor); 

SSLContext ssl = SSLContext.getInstance("TLS"); 

KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
KeyStore store = KeyStore.getInstance("JKS"); 

store.load(new FileInputStream("serverkeystore"),"123456".toCharArray()); 

keyFactory.init(store, "123456".toCharArray()); 


TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

trustFactory.init(store); 


ssl.init(keyFactory.getKeyManagers(), 
new TrustManager[] { tm }, null); 

HttpsConfigurator configurator = new HttpsConfigurator(ssl); 

HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(8083), 8083); 

httpsServer.setHttpsConfigurator(configurator); 

HttpContext httpContext = httpsServer.createContext("/SoapContext/SoapPort"); 

httpsServer.start(); 

endpoint.publish(httpContext); 

而且我有這個PHP代碼測試它:

$soapClient = new SoapClient("https://localhost:8083/SoapContext/SoapPort?wsdl", array('local_cert' => "newcert.pem")); 
$soapClient->add(array('i' => '1', 'j' => '2')); 

不幸的是,它的錯誤了這個時候我包括的local_cert:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://localhost:8083/SoapContext/SoapPort?wsdl' : failed to load external entity "https://localhost:8083/SoapContext/SoapPort?wsdl" 

如果不包含local_cert,它會成功連接,但它永遠不會調用我的自定義TrustManager,所以它接受所有傳入的連接。

我在做什麼錯?謝謝!

回答

0

我做不是知道PHP但你的TrustManager在web服務中沒有做任何驗證。
因此,由於客戶端身份驗證問題,不應拒絕連接。

您在客戶端引用的new_cert.pem是否包含私鑰?
如果不是,那麼這可能是問題。

我建議你採取wireshark並看到溝通。
我懷疑你不會看到來自服務器的拒絕。

失敗應該在您的客戶端本地

+0

謝謝,我會盡力的! – user1070690