HTTPS协议概述:
- HTTPS协议==HTTP协议+SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可见,HTTPS协议是由HTTP和SSL/TLS协议一起合作完成的。至于二者之间的区别,HTTP协议有点类似于“裸奔”,他们数据传输是通过明文的形式做传输,即使约定了加密方式,但是第一次传输的时候还是明文;鉴于此,HTTPS使用的是非对称加密,为秘钥的传输外层再做一层保护,非对称加密的一组秘钥对中,包含一个公钥和一个私钥。明文既可以用公钥加密,用私钥解密;也可以用私钥加密,用公钥解密。
- SSL协议:网络安全协议(安全套接层)
-
SSL协议是在传输通信协议上实现的一种安全协议,采用公开秘钥技术,广泛支持各种类型的网络,同时提供三种基本的安全服务:
- 认证用户和服务器,确保数据发送到正确的客户机和服务器;
- 加密数据以防止数据中途被窃取;
- 维护数据的完整性,确保数据在传输过程中不被篡改;
-
SSL协议的优势在于它与应用层协议独立无关,高层的应用层协议能透明的建立于SSL协议之上,SSL协议在应用层协议通信之前就已经完成加密算法,通信秘钥协商以及服务器的认证工作;在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性和完整性。
HTTPS通信机制:
一、客户端给服务端发送第一个http协议请求,进行三步操作:
- 客户端向服务端发送请求获取身份认证(非对称加密公钥);
- 客户端向服务端发送一个比如a = 1的常量;
- 客户端向服务端发送客户端支持的加密算法的列表,服务端中意哪个算法,确定后返回给客户端。
二、服务端接收到客户端的请求后,进行三步操作:
- 服务端采取一种非对称的加密算法,如:RSA算法生成公钥跟私钥对;
- 对公钥通过CA认证机构颁发的证书进行签名,(相当于数字签名);
- 给客户端返回四类数据:将经过签名的公钥返回给客户端、给客户端返回一个如 b = 3 的常量、返回一个计算公式、从客户端发送过来的包含加密算法的列表中确定一个加密算法如:MD5算法 返回给客户端。
三、客户端接收到服务端返回的四类数据后,进行六步操作:
- 获取到服务端返回的经过证书签名后的公钥后,通过CA认证机构校验本次访问的服务端的真伪,如果没问题,则服务端就是真的;
- 客户端生成一个随机字符串如:kfdn,结合服务端返回的 func = a + b + ‘kfdn’ 这个计算公式生成一个协议秘钥 比如:sss;
- 对刚生成的协议秘钥 sss 通过服务端发送过来的公钥加密成密文如:xxx;
- 对请求数据 ddd 通过刚生成的协议秘钥进行 对称加密 成密文如:kkk;
- 对 (xxx + kkk)通过服务端返回的加密算法 MD5,进行加密即:MD5(xxx + kkk) = ooo;
- 给服务端发送第二个http协议请求
四、服务端接收到客户端发送过来的三类数据后,进行三步操作:
- 通过MD5算法对 (xxx + kkk) 加密 看是否等于 ooo,等于则可证明数据未被篡改;
- 通过RSA算法生成的公私钥对中的私钥 对客户端发送过来的经过公钥加密后的协议秘钥进行解密
- 通过得到的协议秘钥 sss 对密文数据 kkk 进行解密为 ddd 。
图解:
一、配置使用 SSL 完成 https 访问 apache 服务器:
- 1)安装 mod_ssl:
mod_ssl是一种以openssl 的工具箱为基础专门为apache webserver 提供密码保护的软件。
[root@localhost ~]# yum install mod_ssl -y
- 2)查看 ssl.conf:
[root@localhost ~]# cd /etc/httpd/conf.d
[root@localhost conf.d]# ls -l
- 3)切换到 /www下 创建 myssl目录 在index.html中编辑内容:
[root@localhost ~]# cd /www/
[root@localhost www]# mkdir myssl
[root@localhost www]# cd /myssl
[root@localhost myssl]# echo "This is my first https page" > index.html
查看index.html:
- 4)切换到
/etc/httpd/conf.d
对照 ssl.conf 配置自己的 myssl.conf:
[root@localhost ~]# cd /etc/httpd/conf.d
[root@localhost conf.d]# vim myssl.conf
配置内容:
# 需要有一个目录,ssl要访问的目录
# 目录下需要一个index.html
# 设置目录权限
# 设置主机目录
<Directory "/www/myssl">
AllowOverride None
Require all granted
</Directory>
<VirtualHost 192.168.126.100:443 >
SSlEngine on
SSLProtocol all -SSLv3
SSLCipherSuite PROFILE=SYSTEM
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
DocumentRoot "/www/myssl"
alias "/data" "/www/virtualDir/test.html"
</VirtualHost>
- 5)查看防火墙状态,确保关闭:
[root@localhost conf.d]# systemctl status firewalld.service
如果没有关闭,使用命令关闭
[root@localhost conf.d]# systemctl stop firewalld
- 6)查看seLinux的状态是否为宽容模式:
[root@localhost conf.d]# getenforce
设置seLinux的状态为宽容模式
[root@localhost conf.d]# getenforce
- 7)重启 httpd 服务:
[root@localhost conf.d]# systemctl restart httpd
- 8)通过浏览器访问或者curl --insecure https://IP地址:
[root@localhost conf.d]# curl --insecure https://192.168.126.100:443
二、配置访问apache的cgi程序:
- 1)切换目录:
[root@localhost ~]# cd /var/www/cgi-bin/
- 2)打开(或建立) test.cgi 文件:
进行配置:
#!/bin/bash
printf "Content-Type: text/html;charset=utf-8\n\n";
printf "Hello, World.";
- 3)输入ip测试: