转自:http://dannyyuan.blog.51cto.com/212520/118351
项目需要用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-----
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打开证书,在“常规”里面,看到这么一个东西(我直接用[url]https://mail.google.com[/url]试的,因为连它的时候没有出现任何证书确认)
找到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 [url]www.sample.test[/url]
把原来的https连接的ip换成了那个域名,OK!问题搞定,连接成功。
后记:
在整个调试过程中我一直使用 [url]https://mail.google.com[/url] 做为参照来调试。使用这个url的话至于jvm支持,就能直接连接。出现上面的后几个异常,估计都是与域名有关。因为这个域名是一个DNS不能识别的。
这两天朋友使用时又发现这样一个异常:sun.security.validator.ValidatorException: No trusted certificate found 这个异常也是由于没有找到证书造成的,看看证书的路径设置对不对
这两天朋友使用时又发现这样一个异常:sun.security.validator.ValidatorException: No trusted certificate found 这个异常也是由于没有找到证书造成的,看看证书的路径设置对不对
相关推荐
2. 客户端创建Socket对象,连接服务器的IP和端口。 3. 服务器端的Socket接受客户端连接,建立Socket连接后,双方可以通过输入输出流进行数据交换。 4. 数据传输完成后,客户端和服务器都需要关闭Socket连接。 实验...
在Java中,可以使用`java.net.Socket`类来创建客户端连接,`java.net.ServerSocket`类来创建服务器端监听。通过`Socket`实例,客户端可以向服务器发送数据,服务器则通过`ServerSocket`接收连接并处理请求。`...
例如,你可以创建一个类来处理所有的笔记本电脑,然后使用`match if`来区分这些笔记本电脑是否连接到无线网络,从而为无线网络的客户端提供不同的IP地址范围或网络设置。 在运维过程中,理解并熟练运用这些参数是...
客户端通过Socket对象连接到服务器的特定端口,而服务器则在指定端口监听连接请求。一旦连接建立,文件的传输就可以开始了。 在文件传输过程中,有几种常见的方法。一种是将文件按固定大小的块读取,然后通过Socket...
- 可能会使用到线程池来优化多客户端连接的处理,提高系统效率。 - 对于大型聊天应用,可能需要考虑使用更高级的协议,如HTTP/HTTPS或WebSocket,以及分布式架构。 通过以上讲解,我们可以看到Socket编程在构建...
服务器端创建`ServerSocket`实例监听端口,客户端创建`Socket`实例连接服务器。 2. **多线程**:为了同时处理多个客户端的连接,服务器端需要使用多线程。每个客户端连接都会创建一个新的线程来处理其通信。 3. **...
该设计基于树莓派开发板,使用 ARM 微型电脑主板,实现了多线程设计,能够让多个客户端同时连接服务器,并实现客户端之间的信息交换。 系统概述: * 本系统设计基于树莓派开发板,使用 ARM 微型电脑主板 * 树莓派 ...
在客户端程序的编写中,TcpClient类是连接服务器的主要工具,而NetworkStream类则用于在客户端和服务器之间传输数据。编写客户端程序时,需要确保客户端能够正确处理服务器响应,并能够根据需要发送数据。 在实际...
它允许用户通过FTP客户端连接到FTP服务器,执行各种文件操作,如下载、上传、删除等。在这个FTP文件传输的实现课程设计中,我们将深入探讨FTP的基本原理、客户端的设计要点以及如何实现这些基本功能。 首先,理解...
在Linux环境下,使用C或C++进行开发时,GB28181客户端的实现主要包括以下几个关键知识点: 1. **SDK接口封装**:SDK(Software Development Kit)是一组工具、库和文档,帮助开发者构建特定平台或应用。在GB28181...
2. **网络连接设备**:确保服务器能接入网络,使客户端可以访问。 3. **ipconfig命令行工具**:用于查看和配置网络接口的IP信息。 4. **浏览器**:作为客户端,用于测试FTP服务器是否正常工作。 5. **FTP服务程序...
FTP服务器使用FreshFTP软件,客户端通过该软件连接服务器,选择要传输的文件并执行下载。对于TELNET,首先在电脑属性中启用TELNET服务,关闭防火墙,然后使用可视化TELNET工具进行远程连接,输入用户名和密码后,...
当客户端连接时,服务器会为每个客户端创建一个新的Socket,以便进行一对一的通信。 - **客户端**:客户端使用Socket连接到服务器指定的IP地址和端口,建立连接后,可以通过Socket的输出流发送消息,通过输入流接收...
部署WSUS服务器需要按照正确的步骤进行,以确保客户端能够正确地连接到WSUS服务器,并且能够正确地更新操作系统。同时,需要注意客户端发现问题的解决方法,以便客户端能够正确地显示在WSUS列表中。
客户端一定要知道服务器的一个端口,我假设它知道服务器UDP服务的端口,通过发广播给服务器的UDP服务套接字,然后等待该套接字发回服务器TCP聊天室服务的端口号,IP地址用ReceiveForom也苛刻...
使用FTP客户端(如FileZilla)连接到服务器,验证配置是否正确。如果遇到问题,检查日志文件`/var/log/vsftpd.log`获取帮助。 9. **高级功能** - 虚拟用户:通过配置vsftpd,可以实现基于用户名和密码的虚拟用户...
1. 基本的Socket系统调用:如socket()创建套接字,bind()绑定本地地址,listen()监听连接请求,accept()接受连接,connect()客户端连接服务器,send()和recv()发送和接收数据。 2. Socket的启动与终止:通过...
在进行**CA证书服务器的建立与使用**实验时,需要设计客户端和服务端程序来实现基于SSL/TLS的安全通信。下面分别介绍这两种程序的设计框架: 1. **客户端程序框架** ```c SSL_METHOD *meth = SSLv23_client_...