JAVA访问HTTPS协议的Web Service . jdk安裝ser方法
一朋友因工作需要,要访问HTTPS协议的Web Service,与其一同摸索,终于解决。
欣喜之余,记录下来供需要的网友参考。
1. 下载证书
访问服务的WSDL地址,比如 https://访问站点地址/nealnet-epcis/query?wsdl
浏览器会提示证书错误或此网站未经过身份验证。点击查看证书,选择详细信息选项页,可以看到“复制到文件”按钮。
点击保存证书,格式选择为“DER 编码二进制 X.509 (.CER)”,例如保存为 nealnet.cer。
2. 把证书导入到keystore中
通常情况下,JAVA信任库在 C:\Program Files\Java\jdk1.6.0_27\jre\lib\security\cacerts
不同的安装路径会略有不同。
执行 keytool -import -trustcacerts -keystore "C:\Program Files\Java\jdk1.6.0_27\jre\lib\security\cacerts" -storepass changeit -alias nealnet -file nealnet.cer
其中,-alias nealnet 用于指定别名,nealnet.cer 为上面保存的证书。别忘了在命令行提示符执行的时候,证书要在当前路径下哦!
导入之后可以验证一下是否成功
keytool -keystore "C:\Program Files\Java\jdk1.6.0_27\jre\lib\security\cacerts" -storepass changeit -list -alias nealnet
3. 使用CXF wsdl2java工具生成ws客户端代码
wsdl2java -frontend jaxws21 -p com.xxx.ws.nealnet -d src -client https://访问站点地址/nealnet-epcis/query?wsdl
这里值得注意的是,访问站点的地址一定要跟证书的主题属性中的(CN)一致。
如果证书主题属性中,是站点名称,那么切忌不要用IP地址访问。
4. 调用服务
按照上面生成的代码是采用JAXWS API来创建代理对象的,与调用未加密WS服务不同的是,对目标访问地址作一下转换。
URL wsdlURL = MyService.class.getClassLoader.getResource(
"https://访问站点地址/nealnet-epcis/query?wsdl");
QName serviceName = new QName("urn:myService", "MyService");
MyService service = new MyService(wsdlURL, serviceName);
ServicePort client = service.getServicePort();
BindingProvider provider = (BindingProvider)client;
// You can set the address per request here
provider.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://访问站点地址/nealnet-epcis/query?wsdl");
以上代码是从CXF官网找到的,大致的意思处理请求或响应的协议绑定,采用非加密方式。
(这纯属个人理解,似懂非懂,还忘大虾们指正)。采用其他方式创建代理对象的,个人未曾尝试,也就不班门弄斧了。