以下是本地访问,本人创建的一个模拟环境。
JAX-WS + Tomcat7.0 + jdk1.6_37 配置SSL通信的webservice客户端
客户端访问经过ssl双向通信认证了的接口必须添加下面代码(这个前辈都有提到)
public class SSL_tomcat {
public static void main(String[] args) throws UnknownHostException {
ssl_tomcat();
InetAddress addr=InetAddress.getLocalHost();
System.out.println(addr.getHostName());
}
private static final String S_URL ="https://
127.0.0.1:8443/ssh2_backendmanagement/query";
public static void ssl_tomcat () {
try {
System.clearProperty("javax.net.ssl.trustStore");
System.clearProperty("javax.net.ssl.keyStoreType");
System.clearProperty("javax.net.ssl.keyStorePassword");
System.setProperty("javax.net.ssl.trustStore", "E:/ssl/client.truststore");
System.setProperty("javax.net.ssl.trustStorePassword","zxyzxy");
System.setProperty("javax.net.ssl.keyStoreType","PKCS12");
System.setProperty("javax.net.ssl.keyStore","E:/ssl/client.p12") ;
System.setProperty("javax.net.ssl.keyStorePassword","zxyzxy") ;
Security.addProvider(new BouncyCastleProvider());
URL url = new URL(S_URL);
QName qname = new QName("http://ws.common.com/", "RoleQueryService");
Service service = null;
try {
service = Service.create(url, qname);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RoleQuery port = service.getPort(RoleQuery.class);
Response<GetQueryResponse> responseAsync = port.getQueryAsync("周小鱼");
while (!responseAsync.isDone()) {
System.out.println("正在处理……");
}
GetQueryResponse getQueryResponse = responseAsync.get();
String ruslet = getQueryResponse.getReturn();
System.out.println(ruslet);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意红色字体,这里是没有认证的webservice在认证之后需要添加的。网上一般到这里就说已经通过了,而在我的环境下面bug一片天。
首先解释一下这个:"https://127.0.0.1:8443/ssh2_backendmanagement/query"webservice
访问地址中的127.0.0.1,大多数人在开始ssl通信时候可能都容易范网上其他人分享带来的痛苦,在为服务器生成证书的时候将CN=127.0.0.1,当然我不能说前辈有问题(搭建环境不一样吗。),至少我在JAX-WS + Tomcat7.0 + jdk1.6_37这样的配置环境下没有成功,错误是:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present百度一把错误,没有自己想要的答案
我们在网上看见过什么http://test.webservice.com/等,cn其实就是指test.webservice.com,即CN要与访问的地址一致,即要使用域名不能使用IP访问,又出现问题了,着我在本地测试没有域名啊。。。你可以暂时禁用的主机名检查通过使用自定义主机名验证器,它总是返回true。 注意:这只是测试 ,实际应用中不这样做。经过无数次的测试最终的客户端测试成功了的代码是:
public class SSL_tomcat {
public static void main(String[] args) throws UnknownHostException {
ssl_tomcat();
InetAddress addr=InetAddress.getLocalHost();
System.out.println(addr.getHostName());
}
private static final String S_URL ="https://zxy:8443/ssh2_backendmanagement/query";
public static void ssl_tomcat () {
try {
System.clearProperty("javax.net.ssl.trustStore");
System.clearProperty("javax.net.ssl.keyStoreType");
System.clearProperty("javax.net.ssl.keyStorePassword");
System.setProperty("javax.net.ssl.trustStore", "E:/ssl/client.truststore");
System.setProperty("javax.net.ssl.trustStorePassword","zxyzxy");
System.setProperty("javax.net.ssl.keyStoreType","PKCS12");
System.setProperty("javax.net.ssl.keyStore","E:/ssl/client.p12") ;
System.setProperty("javax.net.ssl.keyStorePassword","zxyzxy") ;
Security.addProvider(new BouncyCastleProvider());
URL url = new URL(S_URL);
QName qname = new QName("http://ws.common.com/", "RoleQueryService");
Service service = null;
try {
service = Service.create(url, qname);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RoleQuery port = service.getPort(RoleQuery.class);
Response<GetQueryResponse> responseAsync = port.getQueryAsync("周小鱼");
while (!responseAsync.isDone()) {
System.out.println("正在处理……");
}
GetQueryResponse getQueryResponse = responseAsync.get();
String ruslet = getQueryResponse.getReturn();
System.out.println(ruslet);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我把我的主机名改成了我的名字首字母大写,也就是我电脑的名字(本地测试才能通过,不需要域名),程序没有错误了。
jax-ws添加ssl通信时候遇到的问题,纠结了两天的时间,百度算是在很多棘手的问题上百度不出来的,所有在这里建议有很复杂的问题问google貌似好点儿,不能copy也有很多的解决方案。
如果没有解决的人,欢迎加入知识交流群:133436255,然后在群里面问,一定帮你解决。互相学习。
分享到:
相关推荐
soapui生成webservice客户端代码,比较详细的讲解了配置,以及生成客户端代码的步骤
tomcat8配置HTTPS,简单webservice客户端调用[收集].pdf
webservice客户端生成工具
WebService客户端 WebService客户端 WebService客户端
C++通过gSOAP开发WebService客户端
使用cxf wsdl2java生成webservice客户端命令
Java开发生生WebService客户端代码操作步骤 Java开发生生WebService客户端代码操作步骤 Java开发生生WebService客户端代码操作步骤
cxf生成webservice客户端
webservice 客户端 服务端实例 代码全套 完整 就爱男单实例
cxf 开发webservice客户端 代码经过测试
webservice客户端简单实例 环境 apache-tomcat-6.0.33 jdk1.6.0_32 windows7
这个工程详细的介绍了webService服务客户端如何调用简单和复杂的webService,其中就包括传递的参数是对象类型,返回数据是数组类型,还有最简单的基本类型。压缩包里还配置说明,清晰的说明webService的整个过程,对...
webservice 客户端 实例 java webservice 客户端 实例 java webservice 客户端 实例 java webservice 客户端 实例 java webservice 客户端 实例 java
Java写的WebService客户端,可以发送XML文件,拿来就能用
webservice 客户端自动生成工具,采用批处理脚本(axis1.4的方式)来自动生成客户端java代码,只需要修改一个wsdl的地址,就可以生成代码,谁用谁知道。
服务端采用jdk原生态的生成,客户端为了不需要采用命令行生成采用了axis2的document方法,可调用,代码中既有客户端又有服务端,亲测可用
本人做了一个WebService的Demo,主要是对如何发布和客户端的调用,如有不清楚的地方,可以联系本人QQ:9885465
webservice客户端几种方式调用汇总,客户端代码生成及调用方式详细说明等
springboot整合CXF发布webservice和客户端调用 项目中每个类都有详细的注释,保证都能看懂,不失为一个学习springboot整合cxf来学习webservice发布调用的好例子
VC开发的WEBSERVICE客户端 VC开发的WEBSERVICE客户端 VC开发的WEBSERVICE客户端