生成webservice客户端以及解决SSL异常

x33g5p2x  于2022-08-17 转载在 其他  
字(3.9k)|赞(0)|评价(0)|浏览(275)

生成Webservice代码 并解决异常HTTP 传输错 误:javax.net.ssl.SSLHandshakeException:javax.net.ssl.SSLHandshakeException:SunCertPathBuilderException: unable to find valid certification path to requested target

HTTP 传输错误: javax.net.ssl.SSLHandshakeException: 

SunCertPathBuilderException: unable to find valid certification path to requested target

异常重要日志:

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: HTTP 传输错误: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

最近在对接His的一个webService的接口,因为没搞过webService 所以刚开始就遇到了这个问题,真是出师未捷身先死~~~哈哈哈 这个是生成客户端代码的时候,掉人家的接口出现的错误

在网上找了很多的解决方案,然后发现都是在linux 下的jdk添加证书,因为 大多数的开发环境windows 所有 我就结合网上的方案,总结了一些准备方案

首先 先讲一下怎么得到客户端代码吧

*这里我根据根节点的不同 分为两种情况

正常的

生成客户端代码其实很简单,生成后调人家的接口就行啦,服务端代码的话,自己去找资料学习吧~~~~~
我是用 命令行(其实就是jdk自带的工具 )生成的代码, 同时也可以 用eclipse idea 各种IDE去生成客户端代码

我这里就主要讲一下用命令行生成代码 别的就不在赘述了,为什么只讲这个呢?? 因为用命令行 报错误能看到是什么错误,

如果用IDE的话 是看不到错误的只有一句话(这里我只用 eclipse 和 IDEA 试了下,都是报一句话 很头疼) 所有我就用命令行给大家讲一下吧

这里描述一下正常的 webservice 一会儿讲一下不正常的 正常的步骤如下:

  1. 首先进入到%JAVA_HOME%/bin下
  2. 找到wsimport.exe
  3. 打开 cmd (这里一定要在wsimport.exe同级的目录下, 也就是jdk/bin下)
  4. 输入命令 就可以生成客户端代码啦

wsimport -keep -d E:/test -s E:/test2 -verbose https://**********:*****/csp/hsb/DHC.Published.*****.BS.ZZJServiceInfos.CLS?WSDL

​ 这里描述每个命令的意义吧:

此命令为,在 E 盘 test下生成.class文件。在test2文件夹下生成.java文件

  1. -keep:是否生成java源文件
  2. -d:指定.class文件的输出目录
  3. -s:指定.java文件的输出目录
  4. -p:定义生成类的包名,不定义的话有默认包名
  5. -verbose:在控制台显示输出信息
  6. -b:指定jaxws/jaxb绑定文件或额外的schemas
  7. -extension:使用扩展来支持SOAP1.2

–End____以上是正常的webservice接口,下面来讲一下不正常的webservice接口(仅对我来说,可能是我了解的比较少吧)

不正常的

什么是不正常的webservice呢?

这里我先讲一下运行上面的命令 如果遇到不平常的webservice就会报一个错误 如下
:

为什么是这个错误呢?最重要的原因是: 文档的根元素不是以wsdl:definitions开头的它解析不了

我的这个webservice是以开头的

下面我讲一下解决方法吧

  1. 我们可以去访问 这个wsdl地址,然后复制这个页面中的所有信息
  2. 我们可以随便创建一个xml文件,把这些信息放入到里面,然后保存
  3. 最后一步我们就可以 在这个目录下 进入cmd运行下面的命令
wsimport -s . hello.xml

运行成功后就生成了webservice的客户端代码结构如下:

(ps:这里每个的webservice的服务端写的不同,生成的webservice代码结构也就不同 仅供参考吧)

下面是调用人家的接口,发送报文,拿到响应 就可以根据自己的需求处理啦

ZZJServiceInfos zz = new ZZJServiceInfos();
 ZZJServiceInfosSoap infosSoap = zz.getZZJServiceInfosSoap(); 
 String response = infosSoap.hipMessageService("MES0004", builder.toString().intern());

这里如果你想学习怎么写客户端代码和服务端代码 也可参考一下我的这个博客:

https://blog.csdn.net/qq_47109099/article/details/126031108?spm=1001.2014.3001.5502

-End

报的SSL错误(错误信息可以看一下标题)

错误原因:

  1. ​SSL认证失败
  2. Java在访问SSL加密的网站时,需要从JDK的KeyStore 里面去查找相对应得可信证书,如果不能从默认或者指定的KeyStore 中找到可信证书,就会报这个错误。
    另外,Java所使用的证书仓库并不是Windows系统自带的证书管理。所以即使系统中包含此证书也不可以使用

解决方法:

  • 将所访问站点的证书添加到 我们的JVM中

下面我就讲一下如何在windows下向我们的jdk添加证书吧,如果你的系统是linux的可以参考一下下面的文章

linux的向jdk中添加证书

https://blog.csdn.net/qq_37084673/article/details/108597947

**第一步:**先下载证书,访问webservice的地址,然后点击左上角的那个锁,

​ 然后找到证书的选项并打开详细信息:

点击复制到文件,我们就可以向本地保存证书了实际是一个.cer文件

默认保存在这个路径:

C:\Program Files (x86)\Google\Chrome\Application\103.0.5060.134

**第二步:**然后我们就把这个文件放到我们%JAVA_HOME%/jre/lib/security下

**第三步:**就是运行保存证书到jvm的命令啦,在本目录下(%JAVA_HOME%/jre/lib/security)打开cmd窗口

keytool -import -trustcacerts -alias hello -file hello.cer -keystore cacerts -storepass changeit

这里的hello是名字,要确保现在没有同名的

cacerts 设置成可读写权限。

changeit是默认的密码

**第五步:**在cmd窗口就看到 这些确定信息: **是否信任此证书?**就直接 Y (这里就不截图了)

**第六步:**证书已添加到密钥库中,表示已经成功了

**最后:**我们就可以重新启动一下我们的项目了,就Okk了

在最后还有一个命令跟大家说一下就是查看我们的JVM中的所有证书

keytool -list -keystore D:\jdk1-8/jre/lib/security/cacerts

到这里我的文章就结束了,写作不易,浪费午休的时间写的这篇博客,如果真的帮助到你了,就点一个小心心吧_____
重新启动一下我们的项目了,就Okk了

在最后还有一个命令跟大家说一下就是查看我们的JVM中的所有证书

keytool -list -keystore D:\jdk1-8/jre/lib/security/cacerts

到这里我的文章就结束了,写作不易,浪费午休的时间写的这篇博客,如果真的帮助到你了,就点一个小心心吧_____

相关文章