文档章节

客户端用https连接服务器 (webservices)

~少司命~
 ~少司命~
发布于 2013/03/11 16:00
字数 1295
阅读 64
收藏 0



项目需要用https与服务器进行连接,获取系统需要的一些配置参数。以前是用http进行连接的,客户端代码比较简单,直接使用URL类进行连接并获取输入流即可。试着在浏览器中输入相应的https连接地址,提示证书确认,确认以后就访问到内容了。

   改成https以后碰到了一些问题。原以为Java可能已经封装好了,所以把直接把原来的http连接改成https,结果抛出异 常:java.lang.UnsupportedClassVersionError: test/url/URLTest (Unsupported major.minor version 49.0)。查了一下,是JVM不支持这个协议(《java网络编程》上有说明)。换了一个jdk,这个问题好了。调用 vurl.getProtocol()可以获取相应的协议了。

   接着出现了第二个异常:javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: Java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty。没办法,接着google,发现这个问题跟安全连接的证书有关(安全方面的东西不是很了解,只知道这个公钥,用于验证)。查了一 下,jdk果然提供了跟证书相关的东西。首先要从服务器那得到证书,想了一下,ie好像可以。试着用ie连接地址,然后出现了证书确认的提示框,点击查看 证书-详细信息,点击复制到文件,选择base64编码,导出后就可以用记事本打开了,大概样子如下:

-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQS6WuWd7dHMeAfIkikfDiQzANBgkqhkiG9w0BAQQFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wNjA1MTUyMzE4MTFaFw0w
j8thQJ7StDhAISTBTx/LE0qPlQLfkT3WQOsRb5sQoW/OkV4w9m0TXhWkLsIYngDD
2DJnR/y4HprZmo7M/3wStwO/UiDPIfTzd90SFfCU+pDV41logQ==
-----END CERTIFICATE-----

不用动这个文件,以后直接导入即可。

PS:如果已经点击了证书的确认,可能浏览器就直接打开链接了。这样情况下,可以接着点击ie有下脚的“锁”形符号,即可看见证书。证书搞到手了, 接着要然Java环境能够认识它。这里调用的是jdk带的一个exe,keytool.exe(%JAVA_HOME%/bin下有,所以配了java环 境变量的话直接能在命令行调用了)。这里我们输入导入命令即可:

%JAVA_HOME%\bin\keytool -import -file service.crt -keystore D:/test/urltest/crt

三个参数分别代表:导入操作,导入的证书文件,导入证书存放的位置(PS:这个路径可以使用相对路径也可以是绝对路径,但是相对路径我没有实验成功)。导入过程中会提示用户输入密码,这个密码随便就行,不过位数不能太少:)

   证书是导入成功了,但是问题ms还是没解决,新的异常出现了:

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

没辙,接着google,还好问题不是很麻烦。上面虽然生成了证书,但是还要告诉程序证书的具体位置,涉及一个系统变量要配置。在程序中加入一句话 即可:System.setProperty("javax.net.ssl.trustStore","D:/test/urltest/crt"); 或者在运行java时加入参数:-Djavax.net.ssl.trustStore=D:/test/urltest/crt.

   做了这么多,这个时候是黎明前最黑暗的时候。最后这个问题搞了2小时.......

   异常:java.net.UnknownHostException: 222.222.222.222。 没啥好说了的,google。找来找去,找到一个blog说了这么一句:在生成证书的时候会提示你“你的姓名”,这里别写你的名字,而要写一个ip或者一 个你对应网站的网址。抛出的异常提示的错误确实是我的https请求中的ip,这样的话可能是此ip和证书中的“名字”不相同造成的。再次使用ie打开证 书,在“常规”里面,看到这么一个东西(我直接用https://mail.google.com试的,因为连它的时候没有出现任何证书确认)

   颁发给:www.google.com

找到url了,打开我的证书,哈哈,确实也有这么一个东西,爽。

   更郁闷的来了,url是找到了,可是,此url是个无效的地址.......输入到ie中返回无法连接。这下知道为什么google不用确认 而这个证书需要确认了。因为此url连不通。怎么办?天无绝人之路,还是让我找到了。其实现在我要做的就是一个域名和ip绑定的问题,但是这个绑定不是 DNS来做,而是本机(windows系统)来做。查了一下,果然有,就在C:\WINDOWS\system32\drivers\etc下有一个 host文件,打开它,可以看到这么一行

127.0.0.1 localhost

^_^,原来localhost是这样绑定127.0.0.1的啊,如此就好。我试着加入一行

222.222.222.222 www.sample.test

把原来的https连接的ip换成了那个域名,OK!问题搞定,连接成功。

 

后记:

在整个调试过程中我一直使用 https://mail.google.com 做为参照来调试。使用这个url的话至于jvm支持,就能直接连接。出现上面的后几个异常,估计都是与域名有关。因为这个域名是一个DNS不能识别的。
这两天朋友使用时又发现这样一个异常:sun.security.validator.ValidatorException: No trusted certificate found   这个异常也是由于没有找到证书造成的,看看证书的路径设置对不对


本文转载自:http://wwwww.iteye.com/blog/94854

共有 人打赏支持
~少司命~
粉丝 3
博文 76
码字总数 8735
作品 0
昌平
高级程序员
私信 提问
Android客户端与服务器交互方式-小结

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件...

x-knight_勋爵
2016/04/18
0
0
Silverlight应用整合

在企业应用系统中,企业客户不在满足于呆板的Portal、树形结构、数据堆积的表格和满屏的文字描述。企业客户越来越倡导用户体 验,Silverlight迎合了这种需求,实现了炫目的体验和丰富交互的应...

墙头草
2011/05/03
0
0
Xe5开发web服务端和手机客户端

Xe5开发web服务端和手机客户端   核心提示:我们开发一个三层的android程序建立一个webservices stand-alone vcl application 作为手机访问的服务端1、new-other-webservices2、选择s... ...

vga
2014/06/01
0
0
VMware Vcenter 由于断电重启之后,服务无法启动

由于断电,导致Vcenter机器未正常关机,再启动之后vmware virtualcenter management webservices 服务无法启动。 原因可能是由于再启动的时候,Vcenter所依赖的数据库(我的是SQLserver 200...

forsk
2016/06/22
0
0
Java开发WebServices传递pojo提示参数不匹配的问题

webservices服务用Java开发的时候,参数为基本数据类型是没有什么问题的。 但是如果是传递pojo,也就是java对象,可能你会遇到参数不匹配的问题。 webservices接口暴露出来以后肯定是一个wsd...

古怪945
2015/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

统一客服消息返回错误:{"errcode":43004,"errmsg":"require subscribe hint: [9Vv08633952]"}

公众号或者小程序发送客服消息错误: {"errcode":43004,"errmsg":"require subscribe hint: [9Vv08633952]"} 场景:小程序使用公众号的服务消息,推送消息,如果接收人没有关注公众号,就会出...

tianma3798
14分钟前
1
0
Rainbond V5.0 Beta公测公告

Rainbond支撑企业应用的开发、架构、交付和运维的全流程,通过“无侵入”架构无缝衔接各类企业应用,底层资源可以对接和管理IaaS、虚拟机和物理服务器 Rainbond V5.0即日起开启Beta版本公测,...

好雨云帮
32分钟前
2
0
Word Pattern(leetcode290)

Given a pattern and a string str, find if str follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empt......

woshixin
38分钟前
1
0
Kubernetes 1.13.1快速升级

Kubernetes 1.13.1已经正式发布,快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kubelet版本、拉取镜像、升级Kubernetes集群三个主要步骤。注意Kubernetes 1.12.3版本暂时不支...

openthings
41分钟前
2
0
多线程的实现方式

多线程是指 一个程序运行时,产生或使用了不止一个线程。 线程的生命周期是怎么样的,下面这张图我们可以看出些端倪: 这章我们主要讨论多线程实现的方式,基础知识部分我们可以下来再恶补。...

搬砖大侠
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部