我試圖爲我們的應用程序設置測試環境,該應用程序在Tomcat 6.0中通過HTTPS使用X.509客戶端身份驗證。 servlet代碼期望通過使用servlet請求的javax.servlet.request.X509Certificate
獲得一個證書鏈,作爲X509Certificate
對象的數組。然而,這個數組只包含一個項目(客戶端證書),我期望它有兩個(客戶端證書和簽名它的根CA證書)。無法從Tomcat中的客戶端獲得X509根證書
這是我到目前爲止已經完成:
- 生成的OpenSSL使用自簽名CA證書。
- 將CA證書作爲受信任的根證書導入到新創建的Java密鑰庫中。
clientAuth="true"
truststoreFile="<path_to_truststore>"
- 用openssl生成一個新的客戶端證書,並與簽字:
- 配置Tomcat HTTPS連接器使用在步驟2作爲信任創建的密鑰庫,要求客戶機驗證CA證書。
- 啓動Tomcat。
- 在Chrome中安裝客戶端證書並導航到我的服務器主頁。在調試中單步執行代碼時,我可以看到數組返回爲
javax.servlet.request.X509Certificate
屬性只有客戶端證書。
我知道Tomcat正在從信任庫中獲取根CA證書,因爲當我從信任庫中刪除它時,出現SSL連接錯誤。它只是沒有像文檔所說的那樣將它放入servlet請求中。我在這裏是否缺少其他配置?也許Tomcat(或者Java或者JSSE)期望額外的X509 V3擴展或者其他的東西?
任何幫助表示讚賞!
編輯
看起來像我的設置是合法的,這屬於不尋常的,但預期行爲的類別由於簡化了測試環境。在企業場景中,根證書頒發機構不太可能直接爲單個用戶簽署客戶端證書。很明顯,當這個代碼被編寫和測試時,至少有一箇中間CA參與了信任鏈。
感謝您的調試信息,這是一個很大的幫助。我期待在servlet請求中看到整個證書鏈一直到根CA,但檢查源代碼表明它只是客戶端發送的鏈。 RFC表示發件人可以選擇省略根CA證書; Chrome,Firefox和IE9都忽略了根CA(openssl工具,有趣的是,包含它),並查看調試日誌來確認這一點。 – Alex 2012-03-23 19:21:05