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.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也有很多的解决方案。
转载:http://blog.youkuaiyun.com/small____fish/article/details/8217458