`
380071587
  • 浏览: 445806 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HTTPS(SSL加密)webservice客户端访问总结

 
阅读更多

以下是本地访问,本人创建的一个模拟环境。

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,然后在群里面问,一定帮你解决。互相学习。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics