2012-11-07 101 views
2

我的本地開發機器上有一個有效的密鑰庫,它包含通過HTTPS訪問web服務的證書。複製java密鑰庫

System.setProperty("javax.net.ssl.truststore", "C:\\<workspaceprojectPath>\\SIPkeystore\\truststore.jks"); // sollte wohl auch ohne Keystore klappen 
System.setProperty("javax.net.ssl.keyStore", "C:\\<workspaceprojectPath>\\SIPkeystore\\SIPkeystore.jks"); 
System.setProperty("javax.net.ssl.keyStorePassword", "SECRET"); 

現在我想從另一個項目訪問證書:

我在我的項目通過訪問該密鑰庫。在那裏,我提供了與另一個(本地)項目目錄中的密鑰庫相同的(完整)路徑。

顯然,路徑仍然是由jvm找到的,而且正在設置屬性,但在訪問Web服務時,我得到的錯誤消息與我沒有添加密鑰庫一樣。

當試圖運行的應用程序,我得到一個

sun.security.validator.ValidatorException: PKIX path building failed: 
    sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
    certification path to requested target 

是否有複製現有的密鑰庫的可能性?當我們將應用程序部署到我們的服務器時,這也很重要。該應用程序將作爲獨立的jar運行。 (沒有web服務器)

編輯: 好,拷貝密鑰庫似乎並不成爲問題,因爲我能夠同時使用原來的密鑰庫文件的本地副本運行原來的應用程序。這似乎是一個配置問題。

+0

您確定在第二個項目中連接到同一個Web服務嗎? – user1516873

+0

您確定簽名證書已添加到trustStore中,而不是keyStore中? (只是問,因爲我這樣做,並想知道爲什麼它不起作用!) –

+0

@Devon_C_Miller:我將它添加到密鑰庫。我認爲信任庫只是爲了確保密鑰庫是可信的。你能否詳細說明一下。謝謝 – LuigiEdlCarno

回答

2

首先,如果Web服務不需要客戶端證書(即您自己介紹),則不需要密鑰存儲 - 您只需要信任存儲。

可能是其他項目無法訪問信任庫,因此只是爲了練習,嘗試在那裏打開C:\<workspaceprojectPath>\SIPkeystore\truststore.jks並讀取前幾個字節。如果你成功了,這意味着其他項目有一些其他的信任設置爲默認值,所以在這種情況下可以嘗試:

System.out.println(System.getProperty("javax.net.ssl.trustStore")); 

另外,請記住,Java是區分大小寫的,並且指定javax.net.ssl.truststore屬性,而不是javax.net.ssl.trustStore。試着解決這個問題。

+0

我已經創建了一個包含CA證書的新信任庫。然後,我指定了javax.net.ssl.trustStore和... trustStorePassword(沒有指定任何密鑰庫),它在我的eclipse中的兩個項目(兩個項目中的相同信任庫的絕對路徑)都像一個魅力一樣工作。感謝您的幫助。 – LuigiEdlCarno

+0

@LuigiEdlCarno不客氣! –

4

是否有可能複製現有密鑰庫?

是的。從文件系統的角度來看,它只是一個文件。

我想這個問題是下列之一:

  • 相關屬性未在其他項目中正確設置。
  • 另一個JVM找不到密鑰存儲文件(例如,因爲chrooting或其他)
  • 其他JVM沒有訪問/讀取密鑰存儲文件所需的權限。
  • 讀取訪問正在被(例如)SELinux阻止。
+0

感謝您的回答:我將上述代碼從項目1複製到項目2,因此應該相應地設置屬性。我要檢查一下。那麼,JVM與Project 1相同。將屬性設置爲非存在路徑時,我會得到'keystore not found'異常。我從eclipse運行這兩個項目。他們在同一個工作區中。這是奇怪的事情。 – LuigiEdlCarno

0

valicert class 3 CA證書不在您的默認信任庫(可能是JRE lib/security目錄中的cacerts文件,但完整故事請參閱JSSE documentation)。

我認爲你應該創建自己的信任庫文件(可以是cacerts文件的副本)並將valicert root ca添加到此目錄中。然後使用javax.net.ssl.trustStore系統屬性指向此文件。