簡體   English   中英

相互SSL-以正確的格式獲取密鑰/信任庫

[英]Mutual SSL - getting the key/truststores in the proper formats

我使用OpenSSL生成了CSR:

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服務。 為此,我知道我需要在我的SSLSocketFactory中為JAXB設置信任庫和密鑰庫。

我正在使用以下方法在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());

但是,嘗試在連接服務器時使用此代碼會引發SSLHandshakeException並顯示消息http.client.failed

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

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

假設Java代碼是合法的,如何確定正確創建了keystoretruststore keystore

非常感謝。

我終於想通了。 我使用了FireFox和Portecle

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

注意:一個總是令人困惑的地方:就Portecle / Java而言,“ truststore”和“ keystore”都是密鑰庫 唯一的不同是, 我們在客戶端中用作密鑰庫的密鑰將具有除公共證書之外的私有密鑰。

使用服務器證書構建的TrustStore:

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

  • 通過以下方法在Portecle中打開:檢查菜單>檢查證書>選擇ffTestServerCert.crt

  • 您現在可以看到其中包含的證書(例如,我看到3個)。 每個都需要自己導出。 單擊頁面頂部以及每個按鈕的箭頭按鈕:
  • 點擊“ PEM編碼”按鈕
  • 保存按鈕
  • 另存為.pem文件在磁盤上(例如,說我有caCert1.pem,caCert2.pem,caCert3.pem)

  • 在Portecle中創建新的密鑰庫:File> New Keystore> JKS

  • 對於從上方導出的每個證書(caCert1.pem,caCert2.pem,caCert3.pem),請執行以下操作:
  • 工具>導入可信證書>選擇.pem>導入按鈕
  • 彈出消息框,提示我們需要確定我們是否信任此證書。
  • 單擊確定>確定(如果您信任證書)>是>輸入別名(我將其保留為默認值)>確定
  • 對要導入的任何其他證書重復上述步驟(我全部完成了3個)。

  • 在Portecle中保存密鑰庫:

  • 文件>將密鑰庫另存為...>
  • 輸入信任庫密碼兩次
  • 輸入名稱以將其另存為,例如clientTrustStore.jks

恭喜,這是有效的truststore

使用私鑰和服務器證書構建的KeyStore:

  • 首先將私鑰導入FireFox(或Chrome或IE)
  • 使用瀏覽器以PKCS格式導出私鑰。
  • Firefox>首選項>高級選項卡>加密選項卡>查看證書>您的證書
  • 選擇要導出的文件,然后單擊“備份”按鈕
  • (這里只有選項是PKCS12格式,這是我們想要的)
  • 選擇一個名稱-clientKeys.p12
  • 輸入密鑰庫的密碼
  • 應該說它們已導出,請單擊“確定”。

  • 在Portecle中打開鑰匙

  • File> Open Keystore>選擇我們上面保存的clientKeys.p12
  • 輸入上面選擇的密碼

  • 使用Portecle轉換為JKS

  • 工具>更改密鑰庫類型> JKS
  • 閱讀有關當前類型如何不支持密鑰對輸入密碼的警告消息
  • 重要提示:此操作將設置密鑰對條目password內部 password
  • 要更改內部密鑰對條目的密碼,請在Portecle的文件中選擇任何“密鑰對”(它們的圖標將是一對密鑰,位於另一個密鑰的頂部)
  • 右鍵單擊“密鑰對條目”>“設置密碼”
  • 輸入舊密碼(即“ password”),然后輸入所需的新密碼
  • 打好

  • 保存密鑰庫

  • 在Portecle中執行以下操作:文件>將密鑰庫另存為>輸入名稱,例如clientKeyStore.jks。
  • 點擊保存

已完成

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

要查看如何現在使用它們的示例,您可以簽出: 具有雙向SSL的SOAP-如何發送憑據?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM