我们在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或者是否可以在某处设置? 或者错误可能是因为其他原因?
谢谢!
答案 0 :(得分:4)
通常用于验证证书的标准位于RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile。证书可以(至少)有两个关于其使用情况的扩展程序:Key Usage和Extended 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