2012-08-10 26 views
0

我生成使用OpenSSL一個CSR:相互SSL - 拿到鑰匙/在適當的格式信任庫

openssl req -out MyCompanyCsr.csr -new -newkey rsa:2048 -nodes -keyout MyCompanyPrivateKey.key 

所以開始的時候,我們有:

- MyCompanyPrivateKey.key 
- MyCompanyCsr.csr 

然後,我把它交給我們的集成夥伴,誰迴應了3個文件:

- PartnerIntermediateCa.crt 
- PartnerRootCa.crt 
- MyCompanyCsr.crt 

現在我需要使用相互SSL連接到他們的Web服務。爲此,我知道我需要在JAXB的SSLSocketFactory中設置truststore和keystore。

我使用實例化Java中的密鑰庫和信任:

 KeyStore trustStore = KeyStore.getInstance("JKS"); 
     InputStream tsis = ClassLoader.getSystemResourceAsStream(trustStorePath); 
     trustStore.load(tsis, "mypassword".toCharArray()); 
     tsis.close(); 

     KeyStore keyStore = KeyStore.getInstance("JKS"); 
     InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath); 
     keyStore.load(ksis, "mypassword".toCharArray()); 
     if (ksis != null) { 
     ksis.close(); 
     } 

     TrustManagerFactory tmf = 
      TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     tmf.init(trustStore); 

     KeyManagerFactory kmf = 
      KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     kmf.init(keyStore, "mypassword".toCharArray()); 

但是,試圖在連接到服務器使用此代碼拋出與消息http.client.failed一個SSLHandshakeException

com.sun.xml.ws.client.ClientTransportException: HTTP transport error: 
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 

我使用的keystoretruststore從我的瀏覽器導出,客戶端私鑰爲PKCS,服務器證書爲x509 Cert PKCS#7 w/ Chain'. Then opened them up in Portecle and exported them both as JKS` fi LES。

假設Java代碼是合法的,我怎麼能確定我已經正確創建了keystoretruststore

非常感謝。

回答

0

我終於明白了這一點。我使用了FireFox和Portecle

在瀏覽器中安裝服務器證書和私鑰。

注:人們總是混淆一點:無論是「信任」和「密鑰庫」是密鑰庫儘可能Portecle/Java的雲。唯一的區別是我們使用的我們的密鑰庫在客戶端將會擁有除公共證書之外的私鑰。

信任庫與服務器證書建:

  • 轉到在地址的網址,點擊旁邊的地址欄(鎖圖標,顯示已啓用SSL)
  • 安全選項卡>查看證書>詳細信息選項卡>導出按鈕
  • 選擇類型:X.509帶鏈(PKCS#7)的證書。
  • 另存爲地方ffTestServerCert.crt

  • 通過
  • 公開賽在Portecle:檢查菜單>檢查證書>選擇ffTestServerCert.crt

  • 現在,您可以看到包含在此的證書(我看到3實例) 。每個需要自行導出。點擊箭頭按鈕,在頁面頂部和每個:
  • 點擊「PEM編碼」按鈕
  • 保存按鈕
  • 保存的.pem文件在磁盤(在這個例子中,說我有caCert1.pem,caCert2。 PEM,caCert3.pem)

  • 創建Portecle新的密鑰庫:文件>新建密鑰庫> JKS

  • 對於從上面每個導出證書(caCert1.pem,caCert2.pem,caCert3.pem),這樣做:
  • 工具>導入可信證書>選擇.pem> Imp ort按鈕
  • 消息框彈出,說我們需要確定我們是否信任此證書。
  • 單擊確定>確定(如果你信任的證書)>是>輸入別名(我離開它在默認情況下)>確定
  • 重複你要導入任何其他證書(我做了所有3)。

  • 保存密鑰存儲在Portecle:

  • 文件>保存密鑰存儲爲...>
  • 輸入信任密碼兩次
  • 輸入名稱將其保存爲,如clientTrustStore.jks

恭喜,這是有效的信任庫

密鑰庫使用私鑰和服務器證書建:

  • 先導入私鑰到Firefox(或Chrome或IE)
  • 使用瀏覽器導出PKCS格式的私鑰。
  • 的Firefox>首選項>高級選項卡>加密選項卡>查看證書>您的證書
  • 選擇要導出一個>單擊備份按鈕
  • (唯一的選擇這裏PKCS12格式,這是我們所希望的)
  • 選擇一個名稱 - clientKeys.p12
  • 密鑰庫
  • 應該說,他們分別出口輸入密碼,點擊確定

  • 在Portecle中打開密鑰

  • 文件>打開密鑰庫>選擇clientKeys。P12我們保存上述
  • 輸入密碼選擇上述

  • 轉換使用Portecle

  • 工具>更改倉庫類型> JKS
  • 閱讀關於如何在當前類型不支持關鍵的警告消息JKS - 對輸入密碼
  • 重要提示:此操作將設置爲密鑰對條目password的密碼
  • 要更改內部密鑰對條目的密碼,請在Portecle中的文件中選擇任何「密鑰對」(它們的圖標將是一對密鑰,在另一個上面)
  • 右鍵單擊'密鑰對進入」>設置密碼
  • 輸入舊密碼(這就是‘密碼’),然後輸入新的密碼,你想
  • 點擊OK

  • 保存密鑰庫什麼:

  • 在門CLE做:文件>另存爲密鑰存儲庫>輸入名稱,如clientKeyStore.jks
  • 點擊保存

成品

現在你有正確的配置clientTrustStore.jksclientKeyStore.jks用於驗證您的客戶端。

要查看如何使用這些的示例,可以查看: SOAP with mutual SSL - how to send over credentials?