Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致SSL协商在.NET下成功而在Java下失败?_Java_Ssl_Cxf_X509certificate - Fatal编程技术网

是什么导致SSL协商在.NET下成功而在Java下失败?

是什么导致SSL协商在.NET下成功而在Java下失败?,java,ssl,cxf,x509certificate,Java,Ssl,Cxf,X509certificate,我们必须在Java中使用ApacheCXF创建一个web服务客户机。问题是,我似乎无法使SSL会话正确接合。要么它完全失败,要么服务器无法在应用程序数据传输后破译发送给它的内容,要么我无法从服务器读取响应 但是,当使用.NET中内置的简单soap测试客户机尝试相同的事务时,一切都会顺利运行 服务器正在使用双重身份验证 所有内容都是基于证书的x509,存储在windows证书存储区windows MY和windows ROOT中 编辑 是的,双重身份验证实际上是客户端和服务器身份验证 到目前为止,

我们必须在Java中使用ApacheCXF创建一个web服务客户机。问题是,我似乎无法使SSL会话正确接合。要么它完全失败,要么服务器无法在应用程序数据传输后破译发送给它的内容,要么我无法从服务器读取响应

但是,当使用.NET中内置的简单soap测试客户机尝试相同的事务时,一切都会顺利运行

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

所有内容都是基于证书的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页面,在可读之前必须先对其进行解密

Java不依赖OS证书存储,需要使用自己的证书存储

这将导入您的自签名证书

cd JAVA_HOME/jre/lib/security
keytool -import -file server_cert.cer -keystore cacerts

Java不依赖OS证书存储,需要使用自己的证书存储

这将导入您的自签名证书

cd JAVA_HOME/jre/lib/security
keytool -import -file server_cert.cer -keystore cacerts
大概,通过双重身份验证,您的意思是除了更常见的服务器证书身份验证之外,还使用客户端证书身份验证

了解两边使用了哪些版本的平台以及应用了哪些补丁是很有用的

一些问题可能来自于重新协商修复或缺少修复

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

当该漏洞最初在2009年11月左右被披露时,一些平台和库(如Sun Java或OpenSSL)推出了一个快速修复方案,该方案根本不允许任何重新协商,因此只有客户机证书的初始协商才能起作用。后来,RFC5746编写完成后,这些库开始推出支持此扩展的实现

据我所知,微软在IIS及其web框架中的默认设置是使用重新协商,而不是初始协商。此外,它没有推出初始修复来禁用重新协商,从而有效地保留已知漏洞。它只是在最近推出了一个补丁,默认情况下仍然可以容忍旧的实现:

此Microsoft安全博客上也有关于此问题的解释:

从本质上讲,如果您试图与一个只支持旧协商样式的服务器进行对话,而该堆栈只支持新的重新协商样式,或者根本不支持重新协商,那么它将不起作用

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

大概是通过双重身份验证,您的意思是,除了更常见的服务器证书身份验证之外,您还使用客户端证书身份验证

了解两边使用了哪些版本的平台以及应用了哪些补丁是很有用的

一些问题可能来自于重新协商修复或缺少修复

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

当缺陷最初被披露时 2009年11月,一些平台和库(如Sun Java或OpenSSL)推出了一个快速修复方案,该方案不允许任何重新协商,因此只有客户端证书的初始协商才有效。后来,RFC5746编写完成后,这些库开始推出支持此扩展的实现

据我所知,微软在IIS及其web框架中的默认设置是使用重新协商,而不是初始协商。此外,它没有推出初始修复来禁用重新协商,从而有效地保留已知漏洞。它只是在最近推出了一个补丁,默认情况下仍然可以容忍旧的实现:

此Microsoft安全博客上也有关于此问题的解释:

从本质上讲,如果您试图与一个只支持旧协商样式的服务器进行对话,而该堆栈只支持新的重新协商样式,或者根本不支持重新协商,那么它将不起作用


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

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

正确的问题应该是

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

答案其实就在我们的眼皮底下,然而要得到答案,我们需要正确的问题

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

解决方案大致可以归结为以下两个问题:

虽然客户端在未被请求时不应该发送证书,但我通过在密钥库中调整客户端证书以包含以下内容发现:

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


希望这能帮助其他陷入同样问题的人,在我找到邪恶的根源之前,我肯定会让我转一转。尽管我现在意识到这个问题的表述不正确,因为我陷入了一个循环,因为我的.NET示例实际上是在进行一次破解来绕过这个问题,我还是将此作为一个答案发布

正确的问题应该是

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

答案其实就在我们的眼皮底下,然而要得到答案,我们需要正确的问题

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

解决方案大致可以归结为以下两个问题:

虽然客户端在未被请求时不应该发送证书,但我通过在密钥库中调整客户端证书以包含以下内容发现:

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


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

实际上,JDK6提供了一个新的提供商SunMSCAPI,可以从Windows MY和Windows根存储中加载。但是,我仍然无法使用此提供程序使其工作。我通过直接加载pfx证书尝试了BountyCastle提供商。这似乎解决了一些问题,但我仍然知道serer没有收到客户机证书。我将尝试使用带有CA签名证书的JKS密钥库来完成此项目。实际上,通过JDK6,它们提供了一个新的提供程序SunMSCAPI,可以从Windows MY和Windows根存储加载。但是,我仍然无法使用此提供程序使其工作。我通过直接加载pfx证书尝试了BountyCastle提供商。这似乎解决了一些问题,但我仍然知道serer没有收到客户机证书。我将尝试使用带有CA签名证书的JKS密钥库来执行此项目
t、 谢谢你的详细回答。这确实反映了我遇到的一些障碍。不幸的是,我完全无法控制服务器。我所知道的一切都是从响应的HTTP头中获取的,它是带有ASP.net的IIS 6,除此之外什么都没有。我确实必须设置java,以允许不安全的谈判进一步进行。虽然我仍然不确定重新谈判的原因是什么。很抱歉等待了这么久,结果我们遇到了很多问题,但最终这是一个明显的因素。事实仍然如此,他们正在使用旧的未打补丁的IIS 6来托管仍然存在问题的服务器。谢谢你的回答,这对我们的跑步有很大帮助。你最终真的解决了吗?我也在用CFX对付IIS6。所有证书都已正确安装,javax.net.debug向我显示IIS6在协商阶段停止侦听。感谢您的详细回答。这确实反映了我遇到的一些障碍。不幸的是,我完全无法控制服务器。我所知道的一切都是从响应的HTTP头中获取的,它是带有ASP.net的IIS 6,除此之外什么都没有。我确实必须设置java,以允许不安全的谈判进一步进行。虽然我仍然不确定重新谈判的原因是什么。很抱歉等待了这么久,结果我们遇到了很多问题,但最终这是一个明显的因素。事实仍然如此,他们正在使用旧的未打补丁的IIS 6来托管仍然存在问题的服务器。谢谢你的回答,这对我们的跑步有很大帮助。你最终真的解决了吗?我也在用CFX对付IIS6。所有证书都已正确安装,javax.net.debug向我显示IIS6在协商阶段停止侦听。