Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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
Java 连接到https站点时发生SSLHandshakeException_Java_Ssl_Jmeter_Sslhandshakeexception - Fatal编程技术网

Java 连接到https站点时发生SSLHandshakeException

Java 连接到https站点时发生SSLHandshakeException,java,ssl,jmeter,sslhandshakeexception,Java,Ssl,Jmeter,Sslhandshakeexception,我试图通过jmeter(版本2.13,java版本-1.8u31)记录https,并且在连接到https站点时收到SSLHandshakeException。错误消息是 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.

我试图通过jmeter(版本2.13,java版本-1.8u31)记录https,并且在连接到https站点时收到SSLHandshakeException。错误消息是

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2011)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:436)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
    at org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.open(MeasuringConnectionManager.java:107)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:643)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:517)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:331)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1146)
    at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:240)  
我已打开SSL的调试日志记录,但无法理解根本原因。java客户端似乎发送ClientHello,但没有收到ServerHello消息(服务器选择客户端和服务器都支持的最高版本的SSL和最佳密码套件,并将此信息发送给客户端)。我看到客户端发送、读取和接收的协议版本之间存在差异(TLSv1.1与TLSv1.2)

这是根本原因吗?如果是,我如何修复它

日志粘贴在这里-

更新

正如@Anand Bhatt所建议的,我分析了现场,并理解了以下内容

  • 服务器不支持java 8支持的TLSv1.2
  • 服务器仅支持一个密码套件-TLS_RSA_WITH_AES_256_CBC_SHA
  • 不支持服务器支持的密码套件,这很可能是问题所在
    听起来对吗?如果是这样,我们如何使java 8客户端支持服务器支持的密码套件?

    SSLlabs显然正在测试“开箱即用”支持。Java crypto的问题可以追溯到20世纪90年代,当时美国政府严格限制加密软件的出口, 因此,由当时的Sun now Oracle发布的JRE(或JDK)不允许使用服务器要求的256位对称加密。您必须下载并安装 适用于您的Java(主要)版本的“JCE无限强度管辖权策略文件”;8号在。 文件中的自述文件提供了冗长的细节,但基本上可以替换JRE/lib/security中的两个小jar文件

    TLSv1.2现在不是真正的问题。TLS协议自动协商两端支持(和启用)的最高版本。 Java 8实现了SSLv3、TLSv1.0、TLSv1.1和TLSv1.2,但最近的更新(8u31或7u75及以上)由于POODLE而默认禁用了SSLv3; 如果您愿意,您可以重新启用它,但您应该不愿意。(Java 7实现了相同的协议版本,但由于几年前的版本中存在兼容性问题,客户端默认禁用了1.1和1.2。)

    然而,由于狮子狗和野兽,一些安全机构不再接受SSLv3和TLSv1.0 足够安全;一个重要的例子是信用卡和借记卡,详见。 TLSv1.2包含了一些超过1.1的技术改进,使其成为今天的首选,并且可能会有未来的发现来实现这些改进 改进至关重要;如果您的服务器无法支持1.2(甚至更高版本),那么您就有麻烦了。类似地,服务器的 受支持的套件使用普通RSA密钥交换,即不具有前向保密性,现在被认为是次优的,随着时间的推移,可能会变得不可接受

    keytool(至少对于通常使用的密钥库和信任库文件)与对称加密无关。 如果服务器使用CA根目录(或者更准确、更一般的信任锚点),则可能与此相关 您的JRE和/或应用程序不信任,和/或如果服务器希望在SSL/TLS级别进行客户端身份验证, 这是相当罕见的。(大多数网站在web应用程序级别进行身份验证,如果有的话,至少在HTTP级别进行身份验证。) SSLLAB对服务器证书链(以及其他一些东西)的检查通常比Java更严格,而且
    在这方面没有抱怨,因此您不太可能有问题。

    您已经指定了Java版本或您尝试连接的站点。检查使用的站点,查看它是否支持客户端发送的密码套件。另外,请查看测试结果页面上的握手模拟部分,以查看与您的客户端连接是否存在任何问题。我已使用SSLLAB分析更新了我的评论。java 8似乎不支持服务器提供的密码套件。下一步是什么-通过keytool命令添加密码套件?感谢您的详细回复。更新jar文件解决了这个问题。要完全理解这个问题,你可以就“美国政府严格限制加密软件的出口”发表评论。我不知道算法支持(TLS_RSA_和_AES_256_CBC_SHA)与加密软件的出口有什么关系?@Andy crypto过去主要被政府和军队使用,直到2000年左右,美国政府(和其他人,但后来Sun在美国)才开始使用将加密硬件和软件归类为可能帮助敌人摧毁和限制我们的武器;看见确切地说,所涉及的内容是复杂的和时变的,但“基本”Java最终仅限于128位对称加密,只有美国用户可以升级到更高的强度。你想要的密码套件使用256位AES,超过128位。突发新闻:@FranklinYu:ever more Breaking(十月):也不是8u151+。但是关于JCE-128位的问题,在不同的堆栈上可能有超过一百个答案;如果你想修复所有这些问题,那将是一项艰巨的任务。我已决定只在新的答案中加入新的事实。