问题背景描述:这两天学习jmeter ,今天采用抓包工具将抓取一个端口,web端显示的协议为https 于是我在 jmeter 中将协议设置为 https,jmeter运行时报错javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
问题:为什么会报错?
解释:
1 错误出现频率较高地方:通常出现在尝试用 SSLSocket 去连接一个http端口或者用普通socket 去链接一个https 服务端的端口。
2 初步判断原因:用 Socket 去请求一个 https协议的服务导致这种报错 , 因为服务端提供的不是采用 http 协议服务的端口。
3 深层原因是:
3.1 https 与 http 协议有非常大的差别
https协议有一个安全层使得通信双方的发送的数据都是经过加密的,保证了网络通信中数据的安全性。 但是要实现通信数据加密,就要求通信双方有一个共同的加解密密钥(通常是基于对称加密算法)
3.2 https中ssl层实现原理
与 http 不同 https 协议架构中有 ssl层, ssl安全层通过非对称的 RSA 加解密原理实现密钥交换, 构建安全信息传输通道。关于 非对称的 RSA 加解密原理,其实理解起来也非常简单,就是服务器 a 和客户端 b 还有可信任的第三方 c,a 首先生成一双 RSA公私钥对,c 用自己的 私钥 把这个DES密钥 连同 RSA公钥 一起签发给 客户端证书 , a 将 c自身的证书(包含c私钥对应的公钥),客户端证书 和 RSA私钥 一起发给 b,b 先用 c 自身的证书 做验证保证数据由 a 发出。然后 b 用这个 RSA公钥 对一个对称的 DES密钥 加密,然后可以公开发出去,他不用担心这个密钥会被截取,因为只有 a 才有对应的 RSA私钥,只有a才能解密出来这个DES密钥。这样就完成了对称密钥的交换。
3.3 解释题目中出现报错的问题原理
一般的http协议没有安全层,也不用对通信双方的信息都进行加密,就没有对协议设计对称加密算法,也就没有接受https协议请求的程序,所以,向一个使用 http 协议的 web 服务器发送 https 请求,自然会报错。
4 报错解决方案: 将https安全协议换成,http协议。
运行成功
5 关联学习资源:sslsocket原理和实现,偏实用方向的sslsocket编程



