JDK从1.6升级到1.7引发的问题

handshake alert: unrecognized_name

1
2
3
4
javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1288)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1904)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)

Java 7引进了SNI(Server Name Indication 是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。既是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的证书。)的支持,默认是开启状态的,这个会导致在建立SSL连接握手的时候需要获取到访问连接的正确的虚拟域。要使用SNI,需要客户端和服务器端同时满足条件(客户端和服务器端都支持SNI,客户端发送了正确的域名,服务器端也做了相应的SNI配置)。

为了解决这个问题,可以手动的设置一下jsse.enableSNIExtension属性,暂时把SNI禁用掉,设置方法:

  • 方法一:启动参数中添加:-Djsse.enableSNIExtension=false
  • 方法二:System.setProperty(“jsse.enableSNIExtension”, “false”);

Xstream no-args constructor error

1
com.thoughtworks.xstream.converters.ConversionException: Cannot construct ClassXXX as it does not have a no-args constructor : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor

升级JDK版本,导致xstream不兼容,解决方法:

  • 提供一个无参构造函数
  • xstream版本升级到1.4.4以上
  • ClassXXX实现序列化接口

2016-08-03 10:21:39.972 [schedulerFactoryBean_Worker-2] WARN com.yeepay.common.utils.CallbackUtils - connection error : java.lang.RuntimeException: Could not generate DH keypair
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1904)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1862)

把低版本的bcprovexclude掉:

引入新的版本:

1
2
3
4
5
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15</artifactId>
<version>1.46</version>
</dependency>

References

SSL handshake alert: unrecognized_name error since upgrade to Java 1.7.0

nginx 同一个IP上配置多个HTTPS主机

Xstream no-args constructor error

快钱报错:javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name解决