`
baoqf
  • 浏览: 107264 次
  • 来自: 杭州
社区版块
存档分类
最新评论

客户端用https连接服务器的一点心得

    博客分类:
  • java
阅读更多

客户端用https连接服务器的一点心得

   项目需要用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   这个异常也是由于没有找到证书造成的,看看证书的路径设置对不对

分享到:
评论
2 楼 lc2178890 2012-10-17  
朋友,你在线吗?能不能在线交流一下,我也有遇见这个问题,不过是服务器连接https地址的时候。
1 楼 goglad 2008-07-02  
朋友,没有那么复杂吧,我更具tomcat document里面配置,很顺利,就是 证书框的样子,在firefox里和 http://mail.google.com的不一样,想做点和 gmail一样简洁一些

相关推荐

    基于TCP的服务器客户端程序设计.doc

    2) 编程要充分体现服务器端与客户端的连接建立、数据传输、连接释放的过程; 四、课程设计条件 本次课程设计我采用的是JAVA语言,实现客户端和服务器之间的联系。 Java 编程语言的风格十分接近C、C++语言。Java是...

    XSocket的学习和总结

    它支持写入以及服务器端的应用,以直观的方式客户端应用程序。 检测问题,如低水平NIO选择编程,连接池管理,连接超时被封装的xSocket。 我从它的官网上面下载了两个JAR一个是其核心JAR包xSocket (core) 下载地址...

    cc_to_sever.zip

    ① 服务器端创建ServerSocket,循环调用accept()等待客户端连接 ② 客户端创建一个socket并请求和服务器端连接 ③ 服务器端接受请求,创建socket与该客户建立专线连接 ④ 建立连接的两个socket在一个单独的线程上...

    基于TCP的网络聊天室的设计(一步一步教你CSocket网络编程)

    客户端一定要知道服务器的一个端口,我假设它知道服务器UDP服务的端口,通过发广播给服务器的UDP服务套接字,然后等待该套接字发回服务器TCP聊天室服务的端口号,IP地址用ReceiveForom也苛刻...

    基于TCP/IP~Android客户端与PC通信源码

    基于TCP~socket,Android客户端与PC通信,客户端源码。已经测试,可用。附带apk,和网络调试助手,方便...客户端:一次连接,可发送多次数据。 重点是客户端时时接收服务器端发送来的数据。采用 Handler和Thead结合。

    DHCP服务器与DNS服务器的安装与配置.doc

    当DHCP服务器在给 DHCP客户端分派IP地址时,同时将这些DHCP选项中的服务器数据指定给客户端。 也可以选择"否,我想稍后配置这些选项",并单击"下一步",进入"完成新建作用域 向导"窗口。 15、DHCP客户机的设置 打开...

    完成端口(IOCP)高性能服务器源码

    最近有项目要做一个高性能网络服务器,决定下功夫...我这样设计比用堆栈来实现的好处理是,我可以在SocketAsyncEventArgsPool池中找到任何一个与服务器连接的客户,主动向它发信息。而用堆栈来实现的话,要主动给客户发

    SQL数据库心得,分析得不错

    在客户端只使用IE 5.0、IE 4.0、IE 3.0浏览器的情况下,你可以使用第三种验证方法。你可以在Web 网站上和虚拟目录上都启用NT验证。IE会把用户登录计算机的身份信息发送给IIS,当该用户试图登录SQL Server时IIS...

    PB心得加教程。很多算法

     在连接sqlserver时往往要安装sql客户端软件才能连接上,但是等我们软件开发好后,等待的是一个个去配置,无非是一件麻烦,费时的工作,那怎么样才能在软件安装过程中自动配置sql客户端呢? 首先:操作注册表: ...

Global site tag (gtag.js) - Google Analytics