https 与 http 区别在于 https 比 http多了一个SSL加密层。就是 client端 发送给 server端 的请求报告是经过加密,混淆的。以此来保护我们的数据在网络传输中的安全。
ok, 我们来看一下 client端 发送给 server端 是如何交互的,为什么能保证数据在网络中的安全。
- 时序图:
流程解释:
- 客户端访问:https://www.z.com
- https的监听端口是443端口,比如nginx服务器,nginx.conf 会有如下配置(简略配置)
server { listen 443;# https 监听的是 443端口 server_name www.z.com; ssl on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_certificate /etc/nginx/ssl_key/z.crt.crt; # 公钥 ssl_certificate_key /etc/nginx/ssl_key/z.crt.key; # 私钥 }
nginx 会根据上面配置的ssl_certificate 的路径 /etc/nginx/ssl_key/z.crt.crt 找到www.z.com 域名证书的公钥,将公钥返回给客户端
- 客户端接收到公钥后,会对公钥内容进行解析,校验
- 校验通过后,客户端会随机生成一个randomKey(随机秘钥)
- 客户端再使用z.crt.crt中的公钥,对 randomKey 进行加密,将加密后的内容发送给服务端
- 服务端接收报文后,使用z.crt.key 中的私钥,对加密的内容的进行解密,然后得到 randomKey
- 这时,服务端会将请求域名的响应结果,使用 randomKey 进行加密,返回客户端
- 客户端对 服务端的加密报文使用randomKey 解密,然后就可以展示在浏览器上
通过上面的分析可以知道,https对在网络传输中的数据进行加密,防止别人抓包可以明文的看到你的内容。有些朋友说https 不安全,更多的是说那些不怀好意的人在client客户端上动了手脚,并不是说抓包,然后解密报文。
我们知道后面正常的交互都是通过randomKey来进行加解密的。而randomKey 在网络中的传输只有一次,并且这一次还是使用了z.crt.crt中的公钥进行加密,想要解密只能使用z.crt.key中的私钥,而私钥又是在server端服务器上。
要是能直接进入别人服务器 或 控制别人客户端,那也不用费那么大劲儿抓包破解了。
以上内容仅代表个人观点,如有错误请指出,立马改正