2011-06-23 29 views
2

我們已經開發了一個基於web的Java應用程序,運行在Windows 2008下的Tomcat下。該網站在IIS中啓用了雙向(相互)SSL,需要客戶端使用x.509證書(PKI)作爲SSL的一部分進行身份驗證,並且使用IE的所有證書都可以正常工作。錯誤:KeyUsage不允許數字簽名-java-applet + mutual SSL

該網站還有一個名爲ViewOne ImageViewer的java-applet。這工作得很好,2路SSL與我們的一些證書,但與別人我們得到SSL握手期間,客戶機(Java 1.6)上異常的用戶已經選擇了它的認證證書後:

security: KeyUsage does not allow digital signatures

最明顯證書之間的差異在於EKU(擴展密鑰使用)在證書失敗時不存在。工作證書具有EKU「客戶端身份驗證 - 1.3.6.1.5.5.7.3.2」。

有誰知道是否需要EKU 1.3.6.1.5.5.7.3.2來運行Java applet或者如果這可以設置在某個地方? 或者錯誤可能是因爲別的?

謝謝!

+1

您能否澄清當您說有關工作/失敗證書時您的意思。這裏涉及3個證書:一個在服務器上,一個在客戶端,另一個在小程序的簽名中。 – Bruno

+0

對不起,我感到困惑。我正在談論客戶端證書,它們都來自同一個CA.如果我使用客戶端證書A它工作正常,但如果我使用客戶端證書B它不。他們之間的差異似乎是EKU,但也許這是我錯過的其他東西。我試圖找出爲什麼有差別,並且如果有一些方法來配置java來關心與IE/Windows相同的證書屬性。客戶端證書放在最終用戶智能卡上,不容易替換。 – magnus

回答

4

通常用來驗證證書的標準是RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile。證書可以具有(至少)兩個關於其用法的擴展名:Key UsageExtended Key Usage

  • 密鑰用法

密鑰使用擴展不有關客戶證書具體談。但是,如果存在此擴展名,則必須設置digitalSignature標誌,因爲在SSL/TLS握手期間,CertificateVerify TLS消息使用該證書的私鑰簽名。這是根據RFC 5280中本條規定:(大多數密碼套件將需要keyAgreement太)

The digitalSignature bit is asserted when the subject public key is used for verifying digital signatures, other than signatures on certificates (bit 5) and CRLs (bit 6), such as those used in an entity authentication service, a data origin authentication service, and/or an integrity service.

  • 擴展密鑰用法

這一個,如果更具體的瞭解客戶 - 證書(如果擴展名存在,推薦使用,但並非總是如此):

id-kp-clientAuth    OBJECT IDENTIFIER ::= { id-kp 2 } 
    -- TLS WWW client authentication 
    -- Key usage bits that may be consistent: digitalSignature 
    -- and/or keyAgreement 

您可以在this NSS technical note(這應該適用於其他產品)中找到關於此的更多詳細信息。

當你拿到「安全:密鑰使用不允許數字簽名」,這似乎表明,(非擴展)主要用途是目前你想作爲一個客戶端證書使用的證書中,但是digitalSignature未啓用。 (這是CA頒發這些證書應該做的事情。)

這與applet無關。但是,applet本身的URL有可能受到客戶端證書認證的保護,因爲這些擴展名會失敗。

一個服務器端,因爲你在IIS後面運行它,它是處理TLS/SSL證書驗證的IIS。Apache Tomcat不應該關心它從哪裏獲得證書。 (在Java中,您可以通過配置自定義TrustManager來調整驗證證書的方式,但只有在Java(JSSE)本身處理SSL/TLS連接時才適用;但當Tomcat爲後面的IIS,Apache Httpd甚至當它使用APR)。 我不確定如何使用IIS進行配置,但netsh http add sslcert中有一個選項[ usagecheck= ] enable | disable,這聽起來可能有所幫助。不過,這可能太寬鬆了。 (請謹慎使用。)

這就是說,似乎在證書被髮送之前,客戶端出現錯誤。我必須承認我沒有嘗試過,但是您可能會使用特定的KeyManager來強制使用該證書。我不完全確定這是否會起作用。

就像旁註一樣,簽名小程序是另一回事。要簽署一個小程序,證書需要具有anyExtendedKeyUsageid-kp-codeSigning的擴展密鑰用法。 (簽名不會運行,但運行applet不會)。您可以在此處找到更多信息:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5056088

+0

非常感謝布魯諾這個偉大的信息!這肯定會幫助我們更快地找到問題。現在我將討論調用KeyUsage標誌,而不是EKU。 – magnus

+0

也謝謝。作爲(gnuTLS)'certtool'用戶的註腳,這裏要做的事情是在你希望能夠驗證的證書的模板中使用帶有'signing_key'的'--template',例如,將一個節點完成證書申請的CA證書(在digitalSignature中搜索'man certtool')。 – delicateLatticeworkFever