【问题标题】:Error: KeyUsage does not allow digital signatures - Java-applet + mutual SSL错误:KeyUsage 不允许数字签名 - Java-applet + 相互 SSL
【发布时间】:2011-06-23 17:32:22
【问题描述】:

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

该网站还有一个名为 ViewOne ImageViewer 的 java 小程序。这适用于带有我们的一些证书的 2-way SSL,但对于其他人,在用户选择其身份验证证书后,在 SSL 握手期间,我们在客户端 (java 1.6) 上遇到异常:

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

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

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

谢谢!

【问题讨论】:

  • 您能否澄清您所说的谈论工作/失败证书时的意思。这里涉及到 3 个证书:一个在服务器上,一个在客户端,一个用于小程序的签名。
  • 很抱歉给您带来了困惑。我说的是客户端证书,它们都来自同一个 CA。如果我使用客户端证书 A,它可以正常工作,但如果我使用客户端证书 B,它不会。它们之间的区别似乎是 EKU,但也许这是我缺少的其他东西。我试图找出为什么存在差异,以及是否有某种方法可以配置 java 以关心与 IE/Windows 相同的证书属性。客户端证书放置在最终用户的智能卡上,不易更换。

标签: iis-7 ssl applet x509certificate pki


【解决方案1】:

通常用于验证证书的标准在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 的这一部分,这是必需的:

digitalSignature 位被置位 当主题公钥 用于验证数字签名,而不是 证书(第 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 应该做的事情。)

这与小程序无关。但是,小程序本身的 URL 可能受到客户端证书身份验证的保护,这会因为这些扩展而失败。

在服务器端,由于您在 IIS 后面运行它,因此处理 TLS/SSL 证书验证的是 IIS。 Apache Tomcat 不应该真正关心它从哪里获得证书。 (在 Java 中,您可以通过配置自定义 TrustManagers 来调整验证证书的方式,但这仅适用于 Java (JSSE) 本身处理 SSL/TLS 连接;它不适用于Tomcat 落后于 IIS、Apache Httpd 甚至在它使用 APR 时。) 我不确定如何使用 IIS 进行配置,但netsh http add sslcert 中有一个名为[ usagecheck= ] enable | disable 的选项,听起来可能会有所帮助。不过,这可能太宽容了。 (谨慎使用。)

话虽如此,您似乎在发送证书之前就在客户端收到了错误。我必须承认我没有尝试过,但您也许可以使用特定的KeyManager 来强制使用该证书。我不完全确定这是否可行。

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

【讨论】:

  • 非常感谢布鲁诺提供这么好的信息!这肯定会帮助我们更快地找到问题。现在我将重点研究 KeyUsage 标志,而不是 EKU。
  • 也谢谢。作为 (gnuTLS) certtool 用户的脚注,这里要做的是在您希望能够验证的证书模板中使用 --templatesigning_key,例如,到具有 CA 证书的节点满足证书请求(搜索 man certtool 以获取 digitalSignature)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多