我已經閱讀了一些相關的問題,但他們都沒有幫助我。所以,讓我給你一個小背景故事: 我正在寫一個投票系統,其中有幾個服務器管理註冊,交換投票卡和投票。在註冊用戶提交自己的個人數據時,服務器會檢查數據匹配的數據庫,然後接受用戶的證書,並把它添加到其信任這樣的:在java(自定義)truststore中管理多個條目
KeyStore.Entry entry = new KeyStore.TrustedCertificateEntry(cert);
trustKeyStore.setEntry(alias, entry, null);
,然後存儲在信任庫文件中。在註冊期間,許多用戶註冊他們的證書,然後他們連接到請求客戶端和服務器身份驗證的另一臺服務器,並且在這裏出現問題。我認爲這個「其他服務器」可以使用前面提到的trustStore來與用戶一起執行SSLHandshake,但看起來trustStore'只記住最後一個註冊的用戶。我喜歡這個創建SSLServerSocket:
tmf.init(trustKeyStore);
kmf.init(keyStore, password);
// create, init SSLContext
SSLContext sslCtx = SSLContext.getInstance("TLS");
sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// create SSLSocketFactory and SSLSocket
SSLServerSocketFactory sslSocketFactory = (SSLServerSocketFactory)sslCtx.getServerSocketFactory();
sslSocket = (SSLServerSocket)sslSocketFactory.createServerSocket(1234);
正如我前面提到的,兩面認證工作正常,但僅限於信任庫中的最後一項。所以,現在最後我的問題是 - 我必須爲每個用戶創建一個單獨的trustStore嗎?我必須重載TrustManager嗎?基本上,有什麼辦法可以讓SSLContext/SSLEngine遍歷我的所有可信證書,並且如果找到匹配的證書,可以通過握手進行處理?
UPDATE
我想我需要澄清一些事情。首先,這不是一個web應用程序,只是一個普通的客戶端服務器java swing應用程序。每一個使用的證書(服務器或客戶端)都是自簽名的,但是服務器的證書被構建到客戶端應用程序中,所以當客戶端連接到服務器時,他可以比較證書(作品)。我也試圖像Bruno所建議的那樣解決它 - 在用戶註冊後,服務器檢查他的數據是否有效,是否爲客戶端發佈新證書,將其添加到他的信任庫併發送給客戶端。但即使是最後一個註冊客戶也沒有效果。
您是否爲每個用戶使用* *別名?或者每次覆蓋信任庫條目? – Borealid 2012-02-01 00:26:12
想知道,這些用戶證書是自籤嗎?他們如何獲得他們的證書? – Bruno 2012-02-01 00:31:05
當然,我使用不同的別名:)我檢查了,trsutStore.aliases()確實產生了整個列表。所有用戶證書都是自簽名的。 – michauwilliam 2012-02-01 00:35:10