java webservice 证书_java调用基于https的webservice(不生成密钥,基于spring配置,接收所有证书)...

本文介绍了如何在不生成密钥和安全证书的情况下,使用Java调用基于HTTPS的Webservice。通过Spring配置,结合自定义TrustManager实现接收所有证书,避免了繁琐的证书导入步骤。文中提供了一个拦截器示例,展示了如何在Spring中注入并替换默认的TrustManager以允许任何证书。
摘要由CSDN通过智能技术生成

我的blog:个人博客

最近工作需要调用外部的webservice,之前一直搞的是基于http的ws,没啥好说的

网上很多教程。这次对方提供的接口是基于https的接口,在网上查找都是需要生成密钥,安全证书

等。各种纠结,生成密钥的方法网上都有介绍,我也了解了下,大致是这样的步骤:

第一步、导出服务器端证书。用ie连接地址,然后出现了证书确认的提示框,点击查看证书-详细信息,点击复制到文件,选择base64编码,导出保存文件为test.cert。 第二步、把证书从其它文件导入到TrustStore文件中。 keytool -import -file test.cer -keystore test_store 第三步、设置java的javax.net.ssl.trustStore的系统属性

System.setProperty(“javax.net.ssl.trustStore”, “D: \\test_store”);//注意是绝对路径

System.setProperty("javax.net.ssl.keyStorePassword", "abc");

这样通过应用接口就可以直接访问服务了。

如果基于spring配置的话,cxf官网也给出了例子:

配置如下:、

file="my/file/dir/Morpit.jks"/>

file="my/file/dir/Truststore.jks"/>

.*_EXPORT_.*

.*_EXPORT1024_.*

.*_WITH_DES_.*

.*_WITH_AES_.*

.*_WITH_NULL_.*

.*_DH_anon_.*

Betty

password

但我们不想搞成这种生成证书的方法 ,网上也有办法实现接收所有证书参考:

http://blog.sina.com.cn/s/blog_557c420e0100pyx7.html

核心的东西就是TrustManager类,自己实现X509TrustManager .

但例子都是基于httpclient的,到底如何配置spring呢,开始纠结了

spring配置webservice的基本例子

factory-bean="myServiceFactory" factory-method="create"/>

首先想到的是  将将TrustManger类替换掉成接收所有证书的TrustManager类,

但如何注入是个问题,最后想到拦截器,debug模式进去后果然发现了TrustManger

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

只需要将这个替换掉就ok,于是写一个interceptor,在spring配置:

myTrustInterceptor主要实现:

public void handleMessage(Message message) throws Fault {

System.out.println("我进来了");

HttpsURLConnectionImpl connection=(HttpsURLConnectionImpl)message.get("http.connection") ;

TrustManager[] myTMs = new TrustManager [] {

new MyX509TrustManager() };

SSLContext ctx = null;

try{

ctx = SSLContext.getInstance("SSL");

ctx.init(null, myTMs, new java.security.SecureRandom());

} catch (Exception e){ }

connection.setSSLSocketFactory(ctx.getSocketFactory());

connection.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

// connection.setHostnameVerifier(hv);

System.out.println("我要出去了");

}

这样就可以直接调用服务了。

还有个想法是替换掉JaxWsProxyFactoryBean,实现自己的FactoryBean,这个没能实现,不知道各位看官有没有更好的想法呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值