2012-03-23 79 views
4

我試圖爲我們的應用程序設置測試環境,該應用程序在Tomcat 6.0中通過HTTPS使用X.509客戶端身份驗證。 servlet代碼期望通過使用servlet請求的javax.servlet.request.X509Certificate獲得一個證書鏈,作爲X509Certificate對象的數組。然而,這個數組只包含一個項目(客戶端證書),我期望它有兩個(客戶端證書和簽名它的根CA證書)。無法從Tomcat中的客戶端獲得X509根證書

這是我到目前爲止已經完成:

  1. 生成的OpenSSL使用自簽名CA證書。
  2. 將CA證書作爲受信任的根證書導入到新創建的Java密鑰庫中。
    • clientAuth="true"
    • truststoreFile="<path_to_truststore>"
  3. 用openssl生成一個新的客戶端證書,並與簽字:
  4. 配置Tomcat HTTPS連接器使用在步驟2作爲信任創建的密鑰庫,要求客戶機驗證CA證書。
  5. 啓動Tomcat。
  6. 在Chrome中安裝客戶端證書並導航到我的服務器主頁。在調試中單步執行代碼時,我可以看到數組返回爲javax.servlet.request.X509Certificate屬性只有客戶端證書。

我知道Tomcat正在從信任庫中獲取根CA證書,因爲當我從信任庫中刪除它時,出現SSL連接錯誤。它只是沒有像文檔所說的那樣將它放入servlet請求中。我在這裏是否缺少其他配置?也許Tomcat(或者Java或者JSSE)期望額外的X509 V3擴展或者其他的東西?

任何幫助表示讚賞!

編輯

看起來像我的設置是合法的,這屬於不尋常的,但預期行爲的類別由於簡化了測試環境。在企業場景中,根證書頒發機構不太可能直接爲單個用戶簽署客戶端證書。很明顯,當這個代碼被編寫和測試時,至少有一箇中間CA參與了信任鏈。

回答

3

您所看到的是預期內容:Chrome並未發送CA.

TSL Handshake when authenticating the client期間,服務器將發送可接受的CA列表作爲其證書請求消息(RFC)的一部分,然後瀏覽器將呈現由這些CA之一簽名的證書。

地址

順便說一句,調試SSL連接客戶端的一個好方法是使用神奇的OpenSSL工具

openssl s_client -connect ssl.server.com:443

或SSLV3只有服務器

openssl s_client -connect ssl.server.com:443 -ssl3

這將打印(間其他事情)可接受CA的列表。

要調試服務器端將其添加到JVM命令行-Djavax.net.debug=ssl

+0

感謝您的調試信息,這是一個很大的幫助。我期待在servlet請求中看到整個證書鏈一直到根CA,但檢查源代碼表明它只是客戶端發送的鏈。 RFC表示發件人可以選擇省略根CA證書; Chrome,Firefox和IE9都忽略了根CA(openssl工具,有趣的是,包含它),並查看調試日誌來確認這一點。 – Alex 2012-03-23 19:21:05

0

身份密鑰庫應包含由CA簽署的證書;而不是自簽證書。 CA根應該在信任庫中。

另外,步驟4的目的是什麼?

+0

的CA根是在信任。我正在使用一個單獨的服務器身份證書,該證書也由安裝在Tomcat身份密鑰庫中的CA根簽名。對不起,忘了提到這一點。步驟4的目的是在SSL握手中創建客戶端使用的身份證書。 – Alex 2012-03-23 13:55:37