项目需要用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!问题搞定,连接成功。
分享到:
相关推荐
java socket长连接客户端服务端(标准实例),准确无误,流行结构。
Java 实现 Comet 长连接,服务器主动发送消息给客户端
利用Java语言实现了客户端和服务器端进行交互的程序; 数据库位于服务器端,客户端可以进行查询和登陆操作; 使用时要建一个stu表格并用ODBC数据库连接,并且客户端和服务端要同时运行;
java 简单的网络聊天程序 服务器连接多个客户端 仅供学习使用。
java写的websocket客户端,包含心跳监测。 此架包可解决问题:系统使用websocket 访问远程上的实时数据,但是有时候会停止更新实时数据,只要重启了自己的系统,就会继续更新数据了,此包可以完美解决此问题。
java实现的多人聊天室,可运行到网络服务器上,也可以本地运行。注意修改账号文件保存的位置。计算机网络课程设计。
一个服务器 一个客户端 客户端发消息给服务器,并有反馈。Eclipse开发。
Java版的tcp通信,客户端包括一对一、一对多发送信息,服务器可查看上线人数,并设置最大上线人数
包括登陆和发起呼叫流程
java 连接阿里云的mqtt服务(客户端源码).zip
用Java自己的写FTP服务器与客户端。 Control和Data双线程,数据传输时开20口,21口进行侦听与Control连接 支持USER, PASS, RETR, STOR, ABOR, QUIT 5个口令。用户验证没加入,需要的自行加入。
服务器端主要功能如下:在特定端口上进行侦听,等待客户端连接。统计在 线人数。当停止服务时,断开所有的用户连接。 客户端的主要功能如下:连接到已经开启聊天服务的服务器端。当服务器端 开启的话,用户可以随时...
java jdk6下简单客户端连接服务器端实例
由于需求原因,socket通讯采用 ,net 作为服务器端不断监听java做为客户端发送来的信息。.net 服务器端采用线程方式接收多个客户端连接。已经测试通过。
先打开c++服务器,然后打开java客户端,连接完毕之后上传图片到c++服务器,其中主要是使用socket进行连接通信
java TCP 协议操作,客户端和服务端可以进行通讯,支持多客户端连接
FastDFS服务器是一个轻量级的文件存储服务,结合Nginx使用,实现集群高可用,但是他的java客户端不是特别...本java客户端依赖包,能够完美整合实现FastDFS服务器的连接,上传、下载和删除。 内部附有简单API使用方法。
基于tcp通讯,涉及java的netty服务器的推送功能和c++socket的封装以及protobuf在java和c++中的使用。
Java开发Client客户端,连接Windows的Telnet服务器,解决了中文乱码问题。 分数太高了,不是我设置的,也改不了了,大家不要下了。