简单了解TLS/SSL加解密过程
1. TLS\SSL基本介绍
SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密,SSL与TLS是一个东西。
无论是HTTPS(http传输加密)、WSS(websocket:ws传输加密)、还是其它应用程序之间的TLS传输,都与应用层协议无关,只是在TCP基础之上增加了一个加密过程。
TLS加密原理图:
2. 安装抓包工具
A. 官方下载地址
https://www.wireshark.org/download.html
安装完成后打开软件,可以看到本机网卡列表,后续我们通过它抓包来学习TLS.
B. 配置解密TSL数据
https://liuhuaqiang.blog.csdn.net/article/details/80887436(配置教程)
配置系统环境变量,SSLKEYLOGFILE = C:\ssl_key\sslog.log(注意后缀名一定用log不然不好使,不知道为啥),这样浏览器和WEB服务器协商的TLS秘钥信息会存储到文件中,我们就可以利用Wireshark解密了。注意:C:\ssl_key文件夹需要手动创建。
C. 抓取本机地址数据包
如果服务器与客户端都在同一台机器,正常客户端数据包是不走网卡的,所以正常情况抓不到,需要配置路由表,强制本机数据包也走网卡:
1.以管理员身份运行cmd
2.route add 本机ip mask 255.255.255.255 网关ip
如:route add 172.16.51.115 mask 255.255.255.255 172.16.1.1
使用完毕后用route delete 172.16.51.115 mask 255.255.255.255 172.16.1.1删除,否则所有本机报文都经过网卡出去走一圈回来很耗性能。
3. 配置Nginx-Https
nginx配置https需要用到私钥和证书,把前面生成好的直接拿来用(private_key_pkcs1.pem cert_x509.crt)。
安装nginx
yum install epel-release
yum update
yum install nginx
sudo nginx -v
nginx version: nginx/1.6.3
配置Https
使用我们前面创建的pkcs#1格式的私钥和X509格式的证书。
server {
listen 443 ssl;
server_name test_https;
root /usr/share/nginx/html;
ssl_certificate "/etc/nginx/certs/cert_x509.crt";
ssl_certificate_key "/etc/nginx/certs/private_key_pkcs1.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
启动Nginx
systemctl start nginx
systemctl enable nginx
查看抓包效果,看到浏览器与Nginx通讯的数据已经全部抓到。
4. TLS\SSL加解密过程
我们首选使用普通socket明文传输,然后抓包,可以看到TCP三次握手以后就开始发数据了,数据是明文的,很容易被第三方窃。
我们查看数据包,通过wireshark可以抓取到明文内容helloAlice,数据是没有被加密的。
接下来我们来看看使用TLS以后的传输过程,除了TCP的三次握手以外,还多了SSL握手的数据包,握手的过程就是协商对称加密的秘钥,然后再发送数据。
我们打开ApplicationData查看TCP报文,数据被加密,已经看不到明文信息了。
SSL属于应用层协议,在普通Socket传输基础之上增加了一个TLS层,负责加密与解密数据,加密解密使用对称加密算法完成,客户端与服务器端使用相同的秘钥。由于交换秘钥算法比较复杂,一般高级语言都提供了相应类库,屏蔽了底层的细节,我们直接使用即可。