2015-07-11 218 views
0

我有一個小型安全應用程序,它具有在tomcat 7中運行的服務器和客戶端證書。每個客戶端都有自己的證書。tomcat獲取所有信任證書

在webapp中,我想要一個包含所有已知可信證書別名的選項卡,因爲每個客戶都必須報告所有X分鐘。 如果客戶端在X分鐘後不報告,服務器必須標記該客戶端。

所以我的想法是從Tomcat的Server.xml中定義的truststoreFile獲取所有可信證書,因爲我必須知道所有已註冊的客戶端/證書。

我的問題是,我沒有找到任何api來獲取所有的證書,這是tomcat會信任的。

有人可以幫忙嗎?

回答

0

首先,你確定你的truststore會(總是)包含客戶端證書嗎? 「官方」(X.509/PKIX)客戶端認證(即客戶端證書)方式是爲客戶提供CA(或多個CA)頒發證書;那麼您的服務器不需要單獨信任客戶端證書,只需要CA(s)。這樣一個CA可以是一個公共CA,一個企業,或者一個你(或你的團隊/部門/任何)只爲你的服務器運行。只有自簽名的客戶端證書才需要在服務器信任庫中單獨擁有它們。

其次,webapp(servlet)代碼不可能獲得連接器配置,可能作爲安全功能,請參見Accessing SSL Private Key From a Servlet

但是,如果你有所有的證書在一個信任文件,可以找到該文件(通常是JKS),則:

  • 使用KeyStore.getInstance(String),以獲得正確的密鑰庫對象(JKS)

  • 爲該文件創建一個FileInputStream,並將其提供給ks.load(然後關閉它; try-resource可以爲您執行此操作)。如果不知道密碼使用null,你仍然可以訪問證書(但不privatekeys,只爲JKS)

  • 使用.aliases()拿到店裏所有條目的列表

  • 如果有可以是這個文件中的trustedcerts和privatekey(即它不只是一個 truststore文件)檢查與.isCertificateEntry(alias)

  • 每個別名,你現在有別名,這是當你(或其他人)每個導入證書到信任指定的名稱,但不一定是相同的證書客戶的實際名稱

  • 如果你想(任意)的名稱字段(S)每個證書,叫.getCertificateEntry(alias),轉換爲X509Certificate,並調用.getSubjectX500Principal()然後.toString()或一個.getName()重載並根據需要解析或檢查結果

最後,既然你想使用每個證書通過別名跟蹤請求,爲每個請求獲得Read out incoming certificate in Tomcat用作再看看葉證書即chain[0].getCertificateAlias(Certificate)的證書。跟蹤每個別名上次請求的時間,您可以識別任何「缺失」的。

Javadoc for KeyStore is at http://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html