2

我们开发了一个基于 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 或者是否可以在某处设置?或者错误可能是因为其他原因?

谢谢!

4

1 回答 1

4

通常用于验证证书的标准在RFC 5280:Internet X.509 公钥基础设施证书和证书撤销列表 (CRL) 配置文件中。证书可以(至少)有两个关于其使用的扩展:Key UsageExtended Key Usage

  • 密钥用法

Key Usage 扩展没有专门讨论客户端证书。但是,如果存在此扩展,则digitalSignature必须设置标志,因为在 SSL/TLS 握手期间,CertificateVerifyTLS 消息使用此证书的私钥进行签名。根据 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

您可以在此 NSS 技术说明中找到有关此的更多详细信息(这应该适用于其他产品)。

当您获得“安全性:KeyUsage 不允许数字签名”时,它似乎表明(非扩展)密钥用法存在于您尝试用作客户端证书的证书中,但未digitalSignature启用. (这是颁发这些证书的 CA 应该做的事情。)

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

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

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

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

于 2011-06-23T18:43:35.633 回答