Gangmax Blog

Java https客户端遇到的一个问题以及解决方法

最近手头的项目使用到了Jersey RESTful web service。由于构建在https之上,也用到了证书。

当单元测试通过https客户端连接服务器端的RESTful API methods时,发生如下错误:

SSLException: HelloRequest followed by an unexpected handshake message

查询网络得知如下方法可以解决:

http://stackoverflow.com/questions/2606873/sslexception-hellorequest-followed-by-an-unexpected-handshake-message
add “-Dsun.security.ssl.allowUnsafeRenegotiation=true”

但是该方法实际上具有安全隐患。作为单元测试运行是可以的,但是实际代码中使用是不安全的。从同事处得知该问题是由于JDK的一个bug导致的,具体可以参考:

http://www.oracle.com/technetwork/java/javase/documentation/tlsreadme2-176330.html

也就是说,如果使用JDK 1.6.23之后的版本,则不会产生这个问题。而我使用的是1.6.20,所以就有问题。

为了根除该问题,我在本地安装了JDK 1.6.23,并做了以下修改:

  1. 修改了~/.bashrc中的JAVA_HOME相关设置,使之指向我安装的JDK 1.6.23;
  2. 修改/etc/alternatives/java软连接的指向(指向了我安装的JDK 1.6.23,这样在命令行输入java则运行的就是JDK 1.6.23);
  3. 修改了glassfish的”config/asenv.conf中的AS_JAVA”属性,使之指向我安装的JDK 1.6.23;

修改了以上设置后,在Netbeans中运行单元测试代码,依然得到同样的错误:

SSLException: HelloRequest followed by an unexpected handshake message

此时我想到可能是由于Netbeans使用的JDK配置的问题:因为我并没有删除原来的JDK 1.6.20,所以其有可能还在使用1.6.20版本的JDK。通过网上搜索得到以下配置Netbean JDK的方法:

http://www.benmccann.com/dev-blog/change-the-netbeans-default-jdk/

具体方法是:

  1. 修改”NetBean’s etc/netbeans.conf”中的”netbeans_jdkhome”属性,使之指向我安装的JDK 1.6.23。

然后重新启动Netbeans(只有重启配置才会生效)之后,在其中运行单元测试,通过!

从第3步得知,glassfish使用其”config/asenv.conf中的AS_JAVA”属性指定的JDK;

从第4步得知,Netbeans使用其”etc/netbeans.conf中的netbeans_jdkhome”属性指定的JDK。

两者都没有使用系统的java设置,呵呵!

Comments