繁体   English   中英

SSL + Java 8 + OpenJDK + SNI + HTTPClient =握手失败

[英]SSL+ Java 8 + OpenJDK + SNI + HTTPClient = Handshake Failure

我有一些代码已经工作了很长时间,通过HTTP从webapps获取数据。 它使用Apache HTTPClient(v.4.5.2),适用于有和没有SSL的站点。

最近,我试图使用if用于其他恰好使用SNI的网站。 一切都在我的Windows机器上运行良好,但如果我尝试在AWS EC2 Linux实例上运行它,我会得到握手失败(因为SNI)。

这是我正在运行的:

Windows Java

  • java版“1.8.0_101”
  • Java(TM)SE运行时环境(版本1.8.0_101-b13)
  • Java HotSpot(TM)客户端VM(版本25.101-b13,混合模式,共享)

AWS Linux Java

  • openjdk版本“1.8.0_91”
  • OpenJDK运行时环境(版本1.8.0_91-b14)
  • OpenJDK 64位服务器VM(内置25.91-b14,混合模式)

我不确定哪个组件最终导致失败(Java 8,运行时环境,HTTPClient)。

我已经看过这个( https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension ),但我不确定如何为HTTPClient调整它。 此外,如果我必须更改代码,为什么它可以在Windows上运行?

任何人都知道我应该做什么?

编辑 :根据建议,我查看了jsse.enableSNIExtension属性。 这似乎是错误的,因为它似乎是一种关闭SSL的方法,这不是我想要的。

我尝试在Windows上打开/关闭它,事情只适用于它。 在Linux上,当它打开时,我继续获得握手失败。

这是输出:

Windows - System.setProperty("jsse.enableSNIExtension", "false");
=================================================================

pool-1-thread-1, WRITE: TLSv1.2 Handshake, length = 189
pool-1-thread-1, READ: TLSv1.2 Alert, length = 2
pool-1-thread-1, RECV TLSv1.2 ALERT:  fatal, internal_error
pool-1-thread-1, called closeSocket()
pool-1-thread-1, handling exception: javax.net.ssl.SSLException: Received fatal alert: internal_error


Windows - System.setProperty("jsse.enableSNIExtension", "true");
================================================================

pool-1-thread-1, WRITE: TLSv1.2 Handshake, length = 215
pool-1-thread-1, READ: TLSv1.2 Handshake, length = 93
*** ServerHello, TLSv1.2


Linux - System.setProperty("jsse.enableSNIExtension", "true");
==============================================================

pool-1-thread-1, WRITE: TLSv1.2 Handshake, length = 143
pool-1-thread-1, READ: TLSv1.2 Alert, length = 2
pool-1-thread-1, RECV TLSv1.2 ALERT:  fatal, handshake_failure
pool-1-thread-1, called closeSocket()
pool-1-thread-1, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

在我们的例子中,根本原因是(Java)客户端和服务器无法就足够强大的密码套件达成一致。 解决方案是从https://www.oracle.com/technetwork/java/javase/downloads/jce-all-download-5170447.html安装“Unlimited Strength JCE”

对于Java版本> = 1.8.0_161,这应该不是问题

我有同样的问题,不确定你是否被允许这样做,或者如果你在文档中注意到这一点,但我添加了选项-Djsse.enableSNIExtension=false ,它对我-Djsse.enableSNIExtension=false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM