2016-05-25 67 views
1

我有一個連接到很多外部服務的工作應用程序。我正在添加一個需要客戶端身份驗證的新SOAP客戶端。我可以讓它工作,但不是在不打破應用程序中的其他事情的情況下,所以我對於發生的事情感到非常困惑。一些快速背景:Java客戶端證書衝突

  1. 我們使用默認的cacerts文件,並在那裏導入了很多可信任的證書。
  2. 我們創建了一個私鑰,生成了一個證書請求,獲得了證書,並創建了一個包含用於客戶端身份驗證的證書和私鑰的p12文件。
  3. 如果我們指定P12文件作爲密鑰存儲的應用程序的SOAP客戶端的工作原理:

-Djavax.net.ssl.keyStore = 「keystore.p12」 -Djavax.net.ssl.keyStorePassword =」密碼」 -Djavax.net.ssl.keyStoreType = 「PKCS12」

  • 如果我們不這樣做上述情況,而是導入到cacerts文件這個做:
  • keytool -importkeystore -srckeystore keystore.p12 -destkeystore cacerts -srcstoretype pkcs12

    它不起作用!如果我們這樣做並且它不工作,並且指定cacerts作爲每步3的密鑰庫(不包括最後一個arg,因爲它是不同的商店類型,對吧?)

    因此,通過步驟1-3,我們有了新的集成工作,但問題是,現在應用程序中的其他東西打破了!之前沒有指定其他密鑰庫(我的理解是,它默認爲cacerts)。我們現在有錯誤,如與AWS的SES(電子郵件)服務拋出異常,如:

    • 了java.lang.RuntimeException:無法實例化類com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient的實例
    • COM .amazonaws.AmazonClientException:無法訪問默認的SSL上下文
    • java.security.NoSuchAlgorithmException:錯誤構建的實現(算法:默認,供應商:SunJSSE,等級:sun.security.ssl.SSLContextImpl $ DefaultSSLContext)
    • java.security .UnrecoverableKeyException:無法恢復密鑰

    有人可以向我解釋什麼是造成這種衝突和如何解決它?非常感謝您的幫助!

    傑夫

    +0

    您是否檢查過您是否擁有訪問jre安全庫/文件夾的管理員權限。有時如果你沒有管理權限,你可能會遇到這種例外情況。 –

    +0

    Cacerts是信任商店而不是關鍵商店。 – beny23

    +0

    我有權訪問cacerts - 我已經添加了證書以信任那裏,這工作得很好。我對關鍵和信任商店之間的區別感到困惑。從概念上講,我明白了,但是當我指定一個特定的密鑰存儲區時,其他東西就會中斷,而沒有其他配置。對於每個java文檔和我的文件,它看起來應該放到keystore的cacerts中。 – Jeff057

    回答

    0

    不能肯定,但可能:

    JKS格式可以對包括所有使用javax.net.ssl.keyStore*性質從含有店(文件)的密碼,但許多應用程序不同的一個專用密鑰條目的密碼不能處理那個。

    要麼確保在P12上的進口預密碼(這是覆蓋存儲和密鑰的單一密碼)是相同的目標JKS的存儲密碼(這爲cacerts的安裝是changeit)或指定兩個-deststorepass -destkeypass具有相同的值。

    +0

    謝謝戴夫。我厭倦了重新生成密碼爲「changeit」的p12,再次導入cacerts(覆蓋相同的別名)並得到相同的結果。任何其他想法? – Jeff057

    +0

    @ Jeff057:令人驚訝。請嘗試'keytool -keystore cacerts -certreq -alias $ name'並查看它提示的內容:僅密鑰庫密碼或密鑰密碼。 (我知道我們不需要另一個CSR;丟棄任何輸出,這只是一個測試。)如果'keytool'只能使用存儲密碼訪問,那麼JSSE也應該。 –

    +0

    再次感謝戴夫的迴應!我運行了命令,它只提示密鑰庫密碼(changeit),然後打印證書。所以它*應該*工作,但不... – Jeff057