2017-10-10 44 views
0
從密鑰庫中選擇特定的客戶端證書

我在SAAJ其成功的作品寫的Java客戶端通過HTTP發送SOAP消息時,但是當我嘗試通過HTTPS發送任何SOAP消息發送到Web服務,需要一個客戶端證書它不工作。用SAAJ

在頁面通過以下鏈接的底部 - SAAJ Security - 它規定如下:

從SAAJ方面,所有你需要做的是使用的URL使用HTTPS作爲協議。這隻有在證書被成功導入到/ jre/lib/security/cacerts時纔有效;否則JSSE將不允許連接

我引進的具有相關的根證書以及客戶端證書到我的Java cacerts中的指示,以使上面做,運行該程序,但是我得到以下錯誤:

java.net.SocketException: Connection reset 

我在流量上運行了一個wireshark跟蹤,並注意到當Java代碼被服務器要求時沒有呈現客戶端證書,因此我有以下問題:

1)通過僅將HTTPS URL傳遞給soapConnection .call()方法以及導入cer ts到我的cacerts文件,這足以讓身份驗證發生,即SAAJ是否自動處理?或者是否有更多步驟需要在上述鏈接中描述?

2)通過導入證書到我的JAVA_HOME內cacerts文件,並在Java SAAJ客戶端會自動知道在這裏可以調用soapConnection.call()的時候?或者我需要明確告訴我的代碼使用什麼cacerts文件?

3)如果Java客戶端SAAJ自動使用cacerts文件我JAVA_HOME下那麼它是如何知道使用什麼客戶端證書?同樣,我是否需要明確地編碼或者SAAJ是否自動處理?

在此先感謝

回答

0

我設法弄清楚這一點。我用下面的代碼:

static public void doTrustToCertificates() throws Exception 
{ 

    // Set truststore that contains root/intermediary certs 
    System.setProperty("javax.net.ssl.trustStore", "C:\\cert\\trusted.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

    // Set keystore that contains private key 
    File pKeyFile = new File("C:\\cert\\privatekey.pfx"); 
    String pKeyPassword = "Password01"; 
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); 
    KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
    InputStream keyInput = new FileInputStream(pKeyFile); 
    keyStore.load(keyInput, pKeyPassword.toCharArray()); 
    keyInput.close(); 
    keyManagerFactory.init(keyStore, pKeyPassword.toCharArray()); 

    // Set ssl context with private key and truststore details 
    SSLContext sc = SSLContext.getInstance("TLSv1"); 
    sc.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); 
    SSLSocketFactory sockFact = sc.getSocketFactory(); 

    // Add ssl context to https connection 
    HttpsURLConnection.setDefaultSSLSocketFactory(sockFact); 

} 

然後叫doTrustToCertificates()方法只是SAAJ的soapConnection.call()方法之前,它的工作就像這樣:

doTrustToCertificates(); 
SOAPMessage soapResponse = soapConnection.call(soapMsgXml, ENDPOINT_URL); 
0

你不那麼指示。這些說明具有誤導性,但僅適用於服務器證書是自簽名的情況,並且完全不適用於客戶需要證書的情況。

在這種情況下,您需要在客戶端的密鑰庫中創建客戶端證書。您可以創建CSR並簽名,然後使用與生成密鑰對和CSR時所使用的別名相同的別名將其導回到同一個密鑰存儲庫中,否則您需要生成自簽名證書(yuck)並將其導出並將其導入到服務器的信任庫中。

您不需要編寫任何代碼。您所需要做的就是設置系統屬性javax.net.ssl.keyStore和朋友告訴JSSE您的客戶端密鑰庫。