Netbean 7.0 + glassfish3配置WebService HTTPS笔记

      开始是项目需要Https,调研了WebService,后来项目采用了openssl,就完全是出于技术爱好去研究WebService了。趁这两天周末看了看WebService的安全配置,主要是HTTPS,比较郁闷,到现在还没配成功(后来我用JSP和Servlet成功了,请看后记部分),但是也解决了不少问题,在此先做个记录。

      如果对安全性没有要求,那么借助Netbean 7.0创建和使用WebService非常简单,可以参考:http://netbeans.org/kb/docs/websvc/jax-ws.html#Exercise_1,这个链接既官方又图文并茂,真的非常好,并且在该页底部的See Also栏下列出了一些相关的链接,个人感觉都值得看一看,其中之一叫做Advanced Web Service Interoperability,我这次配置WebService的SSL就是参考的这个,其实我看了好多页官方文档,这里只是列出来了两个,谁要是也需要配WebService的安全性,最好把相关的页都看看,列出来的两个页面上有相关的链接。

  • WebService 服务端

      于是我就开始参照官方文档开始配置带SSL的WebService了,创建WebService服务端及配置它的安全性照着做就可以了,有两点要注意,一是官方文档说创建的时候要选上stateless复选框,但我用netbean6.9.1(7.0没这个问题)时会导致无法测试WebService,另外我不懂这个选项到底什么含义,所以建议跟我一样不懂的人还是别选这个选项了。二是如果配了ssl,也不能测试WebService了,不过这个没关系,不影响创建客户端。

stateless会话

图1 无状态会话

 

  •  WebService客户端

      遇到的第一个问题是,WSDL URL该怎么填,如图2。

wsdl url

图2 WSDL URL

 

      官方文档写的是应填入https://<fully_qualified_hostname>:8181/<rest_of_url>,如https://<fully_qualified_hostname>:8181/CalculatorApplication/CalculatorWSService?wsdl,

那么fully qualified hostname究竟是什么?其实在本机上这个就是计算机名,文档上还专门指出这里不能写localhost,一开始我没明白为什么,后来才发现原来glassfish的证书(也就是WebService服务端证书)是颁发给的“计算机名”而不是颁发给localhost,如果用localhost去访问,浏览器会提示“证书有问题,该证书是颁发给其他网站的”,这里如果填了localhost然后点完成,netbean就会提示下载wsdl文件失败。

    其实这个地方到底该填什么,我们只要看看glassfish的管理控制台(在浏览器中输入http://localhost:4848)就知道了。

    点击要查看的Web服务,如图3:

   

图3 选择要查看的Web服务

    点击查看端点,如图4:

图4 查看端点

    点击WSDL链接,如图5:

图5 点击wsdl链接

    如图6,红线圈起来的就是应该填的wsdl url了,我这里fully qualified hostname是localhost,因为我把计算机名改成localhost了。

图6 得到wsdl url

    在图2中填入得到的wsdl url,点击完成,一般情况下会提示错误,如图7。(图7中错误出现时netbean的输出-〉检索器输出有提示,具体记不得了,反正意思是无法验证服务端证书,可惜我一开始没注意。)

图7 下载wsdl文件出错

    URL绝对正确、没有代理设置、服务器运行正常,究竟是什么问题呢?我尝试用浏览器去访问这个URL,结果出来的页面提示说证书有问题,不是受信任的证书。于是将证书安装到IE的受信任根证书颁发机构中去,如图8:

图8 安装证书

 

    这下IE就可以正常访问WSDL文件了,在图8里就可以看到,再次提醒,证书发布给谁,谁的网站才是可信的,比如这里证书颁发给localhost,网站也是https://localhost,这样才能正确访问,这也是我改计算机名的原因了。但是这样做了以后仍然会有图7中的错误,因为只是给IE装了证书,netbean并不知道。怎么样让netbean信任Web服务端的证书呢?

    先来看看服务端究竟装的是什么证书,打开glassfish控制台(http://localhost:4848),选择配置-〉server-config-〉JVM设置-〉JVM选项,如图9,红线圈出来的就是keystore和cacerts:

图9 查看服务端证书

    图9中指明的keystore、cacerts的绝对路径在glassfish安装目录/glassfish/domains/domain1/config/下,要让netbean信任服务端证书就要为netbean传入与服务端同样的JVM 证书相关选项(图9中的两个选项以及指明密码的另外两个选项)。打开netbean安装目录/etc/netbeans.conf文件,netbeans_default_options那一行就是JVM选项,从开始“-J-Djavax.net.ssl.keyStore“开始到最后都是我添加的,因为我用了绝对路径,所以加了之后我的netbeans_default_options很长。。。

      重新启动netbean,这次成功创建Web服务客户端,没有出现图7中的错误。这时我以为差不多就成功了,后来才发现要做的事情还有很多~

      接下来按照普通Web服务客户端那样加入访问Web服务的代码(比如,在main函数空白处,右键-〉插入代码-〉调用Web服务操作)。完成之后,运行程序,天!又出错了,如图10:

 

 

图10 找不到wsdl

      这不是坑爹吗,在创建Web服务客户端的时候就是指定的这个URL,现在又来找不到!哥怒了(感觉这是netbean的bug呀),直接把抛出这个异常的那行注释了,结果。。。居然就可以了,下面贴出一个外国人解决这个问题的办法:

 

 

 

      在解决了这个问题之后,该运行程序了吧?一运行,又出错,这个错跟图7是一样的,也是无法验证服务端证书。好吧,原来客户端项目还得像netbean那样设置JVM选项以指明可信证书。如图11:

图11 为项目配置VM选项

      再之后,又遇到了新问题,如图12。我google了半天没找到解决办法,下次有时间再研究了。解决了n多问题,真是够麻烦够累的(其实还有几个问题我没记在这里,鉴于我没花多少时间去解决,就没有记的必要了,反正有google嘛)。

图12 No Security Header

  • 后记

      吃完晚饭后我又仔细看了下文档(http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/reference/tutorials/wsit/doc/WSIT_Security9.html#wp151774),发现文档中的客户端是Servlet(我用的是Java应用程序,另一种客户端是JSP),于是重新按照文档中的步骤一步一步创建了客户端,最后成功了,我很想抓包看看是不是真的采用ssl加密了,但是不太好抓本机的包,只能放弃了。另外,图12出现的那个问题还是不知道怎么解决,我甚至怀疑Java应用程序(相对于Java Web应用程序)能不能去访问配置了SSL的WebService(没配SSL的是可以的,官方文档有相应的例子)。于是,我又用JSP客户端测试了下,也成功了,Servlet和JSP不仅不会出现图12中的错误,也不会出现图10中的错误(之前,我怀疑这个错误是netbean的bug),也不用在项目属性中配置JVM选项(是因为Web程序是通过浏览器访问Web服务,而我已经在浏览器中安装了Web服务端证书吗?),我是不是可以说只有Java Web应用程序才能访问配置了SSL安全机制的WebService呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值