错误:KeyUsage不允许数字签名 - Java-applet +相互SSL

时间:2011-06-23 17:32:23

标签: iis-7 ssl applet x509certificate pki

我们在Windows 2008上的IIS下开发了一个在Tomcat中运行的基于Web的Java应用程序。该网站在IIS中启用了双向(相互)SSL,要求客户端使用x.509证书(PKI)作为SSL的一部分进行身份验证这对我们使用IE的所有证书都很好。

该网站还有一个名为ViewOne ImageViewer的java小程序。这与使用我们的一些证书的双向SSL一起正常工作,但是在用户选择其身份验证证书之后,在SSL握手期间,我们在客户端(java 1.6)上获得了异常:

  

安全性:KeyUsage不允许   数字签名

证书之间最明显的区别是证书失败时EKU(扩展密钥用法)不存在。工作证书具有EKU“客户端身份验证 - 1.3.6.1.5.5.7.3.2”。

有没有人知道运行java applet是否需要EKU 1.3.6.1.5.5.7.3.2或者是否可以在某处设置? 或者错误可能是因为其他原因?

谢谢!

1 个答案:

答案 0 :(得分: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的这一部分,这是必需的:

  

数字签名位置位   当主题公钥时         用于验证除签名之外的数字签名         证书(第5位)和CRL(第6位),例如在         实体认证服务,数据源认证         服务和/或诚信服务。

(大多数密码套件也需要keyAgreement。)

  • 扩展密钥用法

如果有更多关于客户证书的信息(如果存在扩展,建议但并非总是如此):

   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中找到有关此内容的更多详情(这应该适用于其他产品)。

当您获得“安全性:KeyUsage不允许数字签名”时,它似乎表明您尝试用作的证书中存在(非扩展的)密钥用法。客户端证书,但未启用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。我不完全确定这是否有用。

正如旁注,签署applet是另一回事。要签署小程序,证书需要具有 anyExtendedKeyUsage id-kp-codeSigning 的扩展密钥用法。 (签名将起作用,但运行小程序不会。)您可以在此处找到更多信息:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5056088