我正在尝试通过jmeter(版本2.13,java版本 - 1.8u31)录制https site,并且在连接到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消息(where服务器选择最高版本的SSL和客户端和服务器都支持的最佳密码套件并将此信息发送给客户端) 。我发现客户端发送,读取和接收的协议版本之间存在差异(TLSv1.1与TLSv1.2)
这是根本原因吗?如果是这样,我该如何解决?
日志粘贴在此处 - Java SSLHandshakeException Logs - Pastebin.com
更新
正如@Anand Bhatt建议的那样,我用ssllabs对网站进行了分析并了解了以下内容
这听起来不错吗?如果是这样,我们如何让java 8客户端支持服务器支持的密码套件?
答案 0 :(得分:6)
SSLlabs显然正在测试开箱即用的#34;支持。 Java加密有一个可以追溯到20世纪90年代的时候,当时美国政府严格限制加密软件的出口, 因此,当时Sun-Oracle 分发的JRE(或JDK)不允许使用服务器要求的 256位对称加密。您必须下载并安装 " JCE无限强度管辖政策文件"适用于您的Java(主要)版本; 8是http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html。 文件中的README提供了longwinded细节,但基本上你在JRE / lib / security中替换了两个小的jar文件。
TLSv1.2 不是真正的问题现在。 TLS协议自动协商两端支持(和启用)的最高版本。 Java 8 实现 SSLv3,TLSv1.0,TLSv1.1和TLSv1.2,但最近的更新(8u31或7u75及更高版本)默认情况下禁用 SSLv3 因为POODLE; 你可以选择重新启用它,但你应该不愿意。 (Java 7实现了相同的协议版本,但默认情况下 client 禁用1.1和1.2,因为几年前它的版本存在兼容性问题。)
但是,由于POODLE和BEAST,一些安全机构不再接受SSLv3和TLSv1.0 足够安全;一个重要的例子是信用卡和借记卡,详见https://security.stackexchange.com/a/87077/39571。 TLSv1.2包含了一些超过1.1的技术改进,使其成为今天首选,并且可能会有未来的发现 改进至关重要如果您的服务器在此时无法支持1.2(也许更高) ,您将遇到麻烦。同样,服务器只是这样的事实 支持套件使用普通RSA密钥交换,即非前向保密,现在被认为是次优的,并且随着时间的推移可能变得不可接受。
keytool (至少使用常用的密钥库和信任库文件)与对称加密无关。
如果服务器使用 CA根(或更准确,更通用,信任锚),则可能是相关的
您的JRE和/或应用程序不信任,和/或服务器是否需要