webservice启用tomcat ssl双向认证之后,请看下文

oLvCha1 2012-07-02 11:32:35
webservice启用tomcat ssl双向认证之后,使用事先写好的webservice客户端访问
服务端的接口https://localhost:8443/WSDemo/SurveyWebService,具体客户端类如下

public class SurveyServiceClient
{
public static void main(String[] args)
{
System.setProperty("javax.net.ssl.keyStore", "G:/SSL/keystore/client.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "client");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.trustStore", "G:/SSL/keystore/tomcat.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "testpass");
// 加载客户端的配置定义
ApplicationContext context = new
ClassPathXmlApplicationContext("beanRefClient.xml");
// 获取定义的 Web Service Bean
ISurveyService surveyService =
(ISurveyService)context.getBean("surveyServiceClient");
// 1、定义调查投票的变量与内容,用来发送给服务
String username = "Test";
int point = 88;
// 调用方法进行服务消费
String result = surveyService.vote(username,point);
System.out.println("Result:" + result);
// 2、传递不一样的调查投票内容
username = "Michael";
point = 100;
// 再次调用方法进行服务消费,得到不一样的结果
result = surveyService.vote(username,point);
System.out.println("Result:" + result);
// 3、第三次传递与调用
username = "Jordan";
point = 9;
result = surveyService.vote(username,point);
System.out.println("Result:" + result);
}
}

客户端main方法如上,但是访问的时候出现异常如下:

org.apache.cxf.interceptor.Fault: Could not send Message.
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:532)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:89)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)
at $Proxy31.vote(Unknown Source)
at ws.cxf.client.SurveyServiceClient.main(SurveyServiceClient.java:26)
Caused by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://localhost:8443/WSDemo/SurveyWebService: java.security.cert.CertificateException: No X509TrustManager implementation available
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1458)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1443)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:659)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
... 9 more
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No X509TrustManager implementation available
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)

客户端里边是不是还需要加上什么代码,请高手指点啊,谢谢!

另外还有一个疑问,ssl协议是不是只能起到握手,确认双方证书身份,然后双方得到对称密钥的作用?那么具体的证书验证应该怎么实现呢,怎么确保客户端和服务端通信的数据被保护呢?
客户端和服务端
...全文
811 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
caolianghua 2012-08-06
  • 打赏
  • 举报
回复
楼主解决了吗?我也遇到和你一样的问题。

[Quote=引用楼主 的回复:]
webservice启用tomcat ssl双向认证之后,使用事先写好的webservice客户端访问
服务端的接口https://localhost:8443/WSDemo/SurveyWebService,具体客户端类如下

Java code

public class SurveyServiceClient
{
public static void main(Stri……
[/Quote]
caolianghua 2012-08-06
  • 打赏
  • 举报
回复
楼主解决了吗?我现在出现和你一样的问题
多云转大雨 2012-07-09
  • 打赏
  • 举报
回复
java可以跳过证书认证
ldhbq2014 2012-07-08
  • 打赏
  • 举报
回复
没有加spring+hibernate呀
ldhbq2014 2012-07-08
  • 打赏
  • 举报
回复


String serviceURL = "https://localhost:8443/httpsxfire/services/HelloWebService";




System.setProperty("javax.net.ssl.keyStore", "d:/lcl.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "aaaaaaa");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");

System.setProperty("javax.net.ssl.trustStore", "d:/tomcat.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "aaaaaaa"); Service serviceModel = new ObjectServiceFactory().create(IHelloWebService.class);

IHelloWebService service=null;
try {
service = (IHelloWebService) new XFireProxyFactory().create(serviceModel, serviceURL);
} catch (MalformedURLException e) {
logger.error("初始化xx网webService失败," + e);
}





System.setProperty("javax.net.debug", "all");



System.err.println(service.sayHello("杨mmm"));
ldhbq2014 2012-07-08
  • 打赏
  • 举报
回复
我用 xfire可以呀
oLvCha1 2012-07-08
  • 打赏
  • 举报
回复
这个是安装了的
[Quote=引用 17 楼 的回复:]

client.p12要先双击安装到浏览器吧
[/Quote]
oLvCha1 2012-07-08
  • 打赏
  • 举报
回复
我就是按照这个配置的,出来了,然后用哪个System.setproperty();那些代码就不行了
[Quote=引用 16 楼 的回复:]

你看一下 CXF 官网上的配置呗:

https://cwiki.apache.org/CXF20DOC/client-http-transport-including-ssl-support.html#ClientHTTPTransport%28includingSSLsupport%29-ConfiguringSSLSupport
[/Quote]
ldhbq2014 2012-07-08
  • 打赏
  • 举报
回复
client.p12要先双击安装到浏览器吧
  • 打赏
  • 举报
回复
JDK 1.6 以下版本:keytool -import -alias server -file server.cer -keystore truststore.jks
JDK 1.6 或以上版本:keytool -importcerts -alias server -file server.cer -keystore truststore.jks

server.cer 是服务器端 X.509 证书
truststore.jks 是你的信任库
alias 取了一个别名

如果加上 -trustcacerts 参数,会将该证书导到 JRE 的 CA 信任库中
  • 打赏
  • 举报
回复
truststore.jks 你是怎么产生的?

你需要把服务器端的公钥导到这个里面去,这样在 SSL 的 ServerHelloDone 后客户端会对证书是否信任进行检查。默认的话 JAVA 使用 JRE/lib/security/cacert 中的 CA 的根证书,若服务端响应的证书不在该信任列表中时,将会抛出 PKIX 的异常。

你再加行代码:

System.setProperty("javax.net.debug", "all");

这可以在控制台输出 SSL/TLS 握手的全过程,从输出中可以找出问题所在。
  • 打赏
  • 举报
回复
这好像不是 JDK 中 SSL 的问题了,感觉是 CXF 的问题了

好像没有找到 X509TrustManager 啊,SSL 一般情况下会加载个默认的 X509TrustManager 啊?
oLvCha1 2012-07-06
  • 打赏
  • 举报
回复
加上那一句话后确实出来很多握手信息,呵呵但是我还没动能直接看出问题在哪的级别,我现在改用openssl生成
ca证书,客户端证书,和服务端证书,然后用cxf配置的方法弄出来了,但是具体代码实现不行,试了无数次了都不行,很不甘心,我qq362315157,不麻烦的话加下我,我给你发具体点的信息过去,帮我看看,如果解决了,我会把解决方法发上来大家共享一下!
[Quote=引用 12 楼 的回复:]

truststore.jks 你是怎么产生的?

你需要把服务器端的公钥导到这个里面去,这样在 SSL 的 ServerHelloDone 后客户端会对证书是否信任进行检查。默认的话 JAVA 使用 JRE/lib/security/cacert 中的 CA 的根证书,若服务端响应的证书不在该信任列表中时,将会抛出 PKIX 的异常。

你再加行代码:

System.setProp……
[/Quote]
nickycheng 2012-07-05
  • 打赏
  • 举报
回复
http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html#ClientHTTPTransport%28includingSSLsupport%29-ConfiguringSSLSupport


A wsdl_first_https sample can be found in the CXF distribution with more detail. Also see this blog entry for another example.

2个sample我觉得应该能搞清楚了吧。官方的文档唉
ndsc1211 2012-07-05
  • 打赏
  • 举报
回复
配置的方法我弄好了出来了,但是至今郁闷的是我用代码实现如下:
调用客户端代码之前,先调用如下函数:
public final static void init(){
System.setProperty("javax.net.ssl.trustStore", "G:\\SSL\\jks\\truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.keyStore", "G:\\SSL\\client\\client.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.keyStoreType","PKCS12");
}
就是死活出不来,悲剧啊,想不通是为啥

[Quote=引用 9 楼 的回复:]

如刚才回复楼上的,webservice 框架cxf生成的客户端代码怎么验证服务端的证书?????我觉得这个问题你能够帮我解决

引用 5 楼 的回复:

我也只是在使用CAS的时候顺便看了些资料,也不是很精通。这东西也不算是什么难懂的东西,多利用网上的资源搜索。自己学学也就会了。
[/Quote]
ndsc1211 2012-07-03
  • 打赏
  • 举报
回复
如刚才回复楼上的,webservice 框架cxf生成的客户端代码怎么验证服务端的证书?????我觉得这个问题你能够帮我解决

[Quote=引用 5 楼 的回复:]

我也只是在使用CAS的时候顺便看了些资料,也不是很精通。这东西也不算是什么难懂的东西,多利用网上的资源搜索。自己学学也就会了。
[/Quote]
ndsc1211 2012-07-03
  • 打赏
  • 举报
回复
如刚才回复楼上的,webservice 框架cxf生成的客户端代码怎么验证服务端的证书?????我觉得这个问题你能够帮我解决

[Quote=引用 5 楼 的回复:]

我也只是在使用CAS的时候顺便看了些资料,也不是很精通。这东西也不算是什么难懂的东西,多利用网上的资源搜索。自己学学也就会了。
[/Quote]
ndsc1211 2012-07-03
  • 打赏
  • 举报
回复
不错啊,这个概念理解了,我现在还是没搞出来,把问题具体化一点说就是:
webservice 框架cxf生成的客户端代码怎么验证服务端的证书,求高人指点啊,这个问题我上网查了,也试了,感觉都不行,郁闷啊
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:
嗯,那就是说证书的验证是ssl协议自动给你验证的是吧?之前做的工作,比如利用keytool生成keystore文件,导出cer文件,将客户端cer文件导入服务端的keystore文件,这些就是证书的验证工作吧?
另外看网上说有个truststore文件,这个truststore和keystore文件有什么不同?


嗯,那就是说证书的验证是ssl协议自动给你验……
[/Quote]
oLvCha1 2012-07-02
  • 打赏
  • 举报
回复
嗯,那就是说证书的验证是ssl协议自动给你验证的是吧?之前做的工作,比如利用keytool生成keystore文件,导出cer文件,将客户端cer文件导入服务端的keystore文件,这些就是证书的验证工作吧?
另外看网上说有个truststore文件,这个truststore和keystore文件有什么不同?

[Quote=引用 2 楼 的回复:]

前面这个问题我没研究,就不献丑了。

后面这个问题比较简单,简单说下:

◎ ssl协议是不是只能起到握手,确认双方证书身份,然后双方得到对称密钥的作用?
—— SSL协议主责是握手并建立后续安全通讯信道,可以理解为得到对称密钥;
—— 但握手过程包含对证书的验证,不受信证书是无法双向握手的;

◎ 那么具体的证书验证应该怎么实现呢,怎么确保客户端和服务端通信的数据被保护呢?
……
[/Quote]
加载更多回复(5)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧