我正在服务器上测试一些功能。直到昨天为止都运行良好。今天,他们已经启用了 ssl 到服务器(即从 http 到 https)。现在,当我运行测试计划时,出现以下错误。我该如何解决这个问题。
尽管我在请求中将协议值更改为 https,但我收到以下错误,
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
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.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:481)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:298)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1105)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1094)
at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:429)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: Could not generate DH keypair
at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverKeyExchange(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
... 17 more
Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DashoA13*..)
at java.security.KeyPairGenerator$Delegate.initialize(Unknown Source)
... 24 more
到底是什么原因呢?我需要在请求中添加任何内容吗?
Dupe of Java:为什么 SSL 握手会出现“无法生成 DH 密钥对”异常?
and Java 7 无法生成 DH 密钥对 except updateJava8已将DH限制提升至2048。
当您的客户端 Java (JSSE) 和服务器使用临时 Diffie-Hellman (DHE) 协商密码套件并且服务器使用大于 1024 位的 D-H 大小并且您的客户端 Java 不支持它时,就会发生这种情况。这取决于您的客户端 Java 版本和服务器实现以及(通常)配置的组合(您没有指定)。
如果您的客户端(此处为 jmeter)在 Java6 或 Java7 上运行,则它无法处理超过 1024 的 DH 大小,这现在被认为是安全所必需的,并且是美国政府 NIST 等权威机构所要求的。满意度下降的解决方案是:
在 Java8 上运行客户端(假设服务器只需要 DHE 2048 位,就像现在的标准/传统)
如果服务器也支持 ECDHE,并且比 DHE 更喜欢它或尊重客户端首选项,请使用edit任何 Java8 或/edit最近的 Java7(支持 ECDHE,并且在大约 7u09 之后更喜欢它)或使用添加了 ECC 提供程序的 Java6(支持并更喜欢 ECDHE)(但 Java6 不再受支持,因此通常是一个坏主意,并且可能不支持最近编译的客户端)。
如果服务器还支持普通 RSA(非临时),请更改您的客户端以仅进行协商。对于标准 Java HttpsURLConnection,这可以通过系统属性 https.cipherSuites 来完成;我不知道 Apache httpclient 是否做同样或等效的事情。这并不能为您的客户提供完美的前向保密性,虽然不太理想,但总比没有好。
将服务器更改为使用 1024 位的 DHE(对于其他客户端来说安全性稍差)或仅使用普通 RSA(对于其他客户端来说安全性更低)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)