1

我们必须使用 Java 中的 Apache CXF 创建一个 Web 服务客户端。问题是我似乎无法让 SSL 会话正确参与。要么完全失败,要么服务器无法在传输应用程序数据后破译发送给它的内容,或者我无法读取来自服务器的响应。

但是,当使用 .NET 中内置的简单肥皂测试客户端尝试相同的事务时,一切运行顺利。

服务器正在使用双重身份验证。

一切都是基于证书的 (x509) 存储在 windows 证书存储区(windows-MY 和 windows-ROOT)


编辑是的,双重身份验证确实是客户端和服务器身份验证。

到目前为止,使用 bountyCastle 提供程序而不是 SunMSCAPI 似乎更进一步,但仍然无法使客户端身份验证正常工作。

不幸的是,我只能收集客户端 CXF 2.2.9、Sun JDK 1.6_21 服务器 IIS 6 ASP.NET 的平台,我无法控制服务器,必须按原样使用它。

更新 我现在正在使用 JKS 密钥库,但仍然遇到问题。作为身份验证过程的一部分,客户端似乎没有将他的证书发送到服务器。结果,我从服务器收到 403.7 错误。

有趣的是,我收到此错误消息作为 HTML 页面,必须首先解密才能读取!

4

3 回答 3

4

据推测,通过双重身份验证,您的意思是除了服务器证书身份验证(更常见)之外,您还使用客户端证书身份验证。

了解双方使用的平台版本以及应用了哪些补丁会很有用。

某些问题可能来自对CVE-2009-3555的重新协商修复(或缺乏修复)。

问题在于 TLS 中重新协商的初始设计存在缺陷,该设计用于重新协商客户端证书。有两种获取客户端证书的方法:服务器在初始 TLS 握手期间请求它,或者在随后的握手期间请求它(例如,一旦它确定了请求的目标和/或试图进入某个限制区域时)。第二种方法是重新协商。不幸的是,在这方面 TLS 协议的设计存在安全漏洞,由于RFC 5746中描述的 TLS 扩展,该漏洞已得到修复。

当漏洞最初被披露时(大约在 2009 年 11 月),一些平台和库(例如 Sun Java 或 OpenSSL)推出了一个快速修复程序,它根本不允许任何重新协商(因此只有客户端证书的初始协商才有效)。后来,一旦编写了 RFC 5746,这些库就开始推出支持此扩展的实现。

据我所知,微软在 IIS 及其 Web 框架中的默认设置是使用重新协商而不是初始协商。此外,它没有推出禁用重新协商的初始修复(有效地保留已知漏洞)。它最近才推出了一个补丁(默认情况下仍然容忍​​旧的实现):Microsoft Security Bulletin MS1​​0-049 - Critical

这个微软安全博客上也有对该问题的解释:http: //blogs.technet.com/b/srd/archive/2010/08/10/ms10-049-an-inside-look-at-cve- 2009-3555-the-tls-renegotiation-vulnerability.aspx

本质上,如果您试图与仅支持旧协商风格的服务器对话,堆栈中只有新的重新协商风格或根本没有重新协商,它不会工作。

如果您的服务器使用 IIS 或类似环境运行,您可以使用netsh及其clientcertnegotiation=enable选项打开初始客户端证书协商。

于 2010-08-26T16:18:21.897 回答
3

Java 不依赖操作系统证书存储,需要使用自己的证书存储。

这将导入您的自签名证书。

cd JAVA_HOME/jre/lib/security
keytool -import -file server_cert.cer -keystore cacerts
于 2010-08-26T15:50:30.263 回答
0

我将其发布为答案,尽管我现在意识到这个问题没有正确制定,因为我陷入了一个循环,因为我的 .NET 示例实际上是在执行破解来解决问题。

正确的问题应该是

如何让 Java 在不要求请求证书的服务器上执行客户端身份验证?

答案实际上就在我们的眼皮底下,但是要得到答案,需要正确的问题!!

非常感谢布鲁诺提供了一些非常有用的信息。

解决方案几乎可以概括为以下两个问题:

Java HTTPS 客户端证书认证

客户端 SSL 身份验证导致 IIS 出现 403.7 错误

尽管如果不询问客户端“不应该”发送证书,我发现通过调整密钥库中的客户端证书以包含以下内容:

  • 具有所有扩展名的客户端证书
  • 客户端私钥
  • 客户完整认证链的串联。

将所有这些推送到同一个证书库中并将其用作密钥库。然后再次加载证书链作为信任库。从那里它应该可以工作。话虽如此,仍然有失败的可能性。解决此特定问题的最安全方法是让服务器通过提供接受的 CA 列表来主动向客户端请求身份验证证书。

希望这可以帮助其他可能陷入同样问题的人,在我找到邪恶的根源之前,一定要让我兜兜转转。

于 2010-08-27T19:22:52.050 回答