Apache Httpd 2.2实现https加密
本文将通过实验来实现https加密。主要内容如下:
- https 简介以及与http的区别
- SSL会话的简化过程
- 实验实现https
https 简介以及与http的区别
https简介
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。HTTPS,即http over ssl,是HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
https和http区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
SSL会话的简化过程
一、客户端发送可供选择的加密方式,并向服务器请求证书。
二、服务器端发送证书以及选定的加密方式给客户端,这个证书是用CA的私钥加密的服务器的公钥以及证书的有效期等信息,也就是CA数字签名的证书。
三、客户端取得证书并进行证书验证
如果信任给服务器发证书的CA,客户端会实验得到CA的公钥
- 验证证书来源的合法性;用CA的公钥解密证书上数字签名
- 验证证书的内容的合法性:完整性验证
- 检查证书的有效期限
- 检查证书是否被吊销
- 证书中拥有者的名字,与访问的目标主机要一致
四、客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换。
五、 服务用此密钥加密用户请求的资源,响应给客户端。
实验实现https
下面是实验的拓扑图。
基本要实现的功能大致可以从图中获取,这里不再仔细介绍。直接进行实验。
环境准备
准备4台虚拟机。
A:系统是centos7.3,IP地址是192.168.1.7,充当CA,负责给websrv颁发证书;
B:系统是centos6.9,IP地址是192.168.1.6,充当websrv,供客户端访问,需要向CA证书颁发者申请证书,websrv的站点是www.a.com;
C:系统是centos7.3,IP地址是192.168.1.8,充当DNS,负责向client解析域名;
D:系统是centos7.3,IP地址是192.168.1.14,是client,DNS设置为192.168.1.8,用于最终访问websrv。
实验过程
一、在C上搭建 DNS
- 安装相关包,并启动服务
yum install bind
systemctl start named
systemctl enable named
- 修改/etc/named.conf中的两行
listen-on port 53 { localhost; };
allow-query { any; };
- /etc/named.rfc1912.zones中添加
zone "a.com" IN {
type master;
file "a.com.zone";
};
- 创建区域数据库
vim /var/named/a.com.zone
$TTL 1D
@ IN SOA dns1.a.com. admin.a.com. (
2017101015 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
604800 ; expire (1 week)
10800 ; minimum (3 hours)
)
NS dns1.a.com.
dns1 A 192.168.1.8
websrv A 192.168.1.6
www CNAME websrv
- 语法检查以及重启服务
named-checkconf
named-checkzone "a.com" /var/named/a.com.zone
systemctl restart named
- 客户端测试
# 在D上面,把dns改为192.168.1.8,ping测试
[root@centos7 ~]# ping www.a.com
PING websrv.a.com (192.168.1.6) 56(84) bytes of data.
64 bytes from 192.168.1.6 (192.168.1.6): icmp_seq=1 ttl=64 time=0.309 ms
64 bytes from 192.168.1.6 (192.168.1.6): icmp_seq=2 ttl=64 time=0.345 ms
二、在A上搭建CA
- 创建私钥文件
cd /etc/pki/CA
(umask 066; openssl genrsa -out private/cakey.pem 4096)
- 利用私钥文件生成自签名证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
# 填写的信息如下
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:henan
Locality Name (eg, city) [Default City]:zhengzhou
Organization Name (eg, company) [Default Company Ltd]:magedu.com
Organizational Unit Name (eg, section) []:Opt
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
Email Address []:
# 查看签名证书的内容
openssl x509 -in cacert.pem -noout -text
- 创建数据库文件以及序列号文件
touch index.txt
echo 00 > serial
三、在B上加载https模块以及申请证书
- 安装SSL模块
一般系统都是安装httpd,所以只要安装https模块就可以了。
yum install mod_ssl
service httpd reload # 安装完之后需要重新加载httpd服务
[root@centos6 ~]#httpd -M | grep ssl
Syntax OK
ssl_module (shared)
- 申请证书
cd /etc/httpd/conf.d/
mkdir ssl;cd ssl
# 创建私钥文件
(umask 066; openssl genrsa -out httpd.key 1024)
# 利用私钥生成证书申请文件
openssl req -new -key httpd.key -out httpd.csr
# 填写信息如下
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:henan
Locality Name (eg, city) [Default City]:luoyang
Organization Name (eg, company) [Default Company Ltd]:magedu.com
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:*.a.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# 提交证书申请文件
scp httpd.csr 192.168.1.7:/etc/pki/CA/
四、A向B颁发证书
cd /etc/pki/CA
# 生成证书文件
openssl ca -in httpd.csr -out certs/httpd.crt -days 300
# 将证书发送给B(websrv)
scp certs/httpd.crt 192.168.1.6:/etc/httpd/conf.d/ssl/
# 将自签名证书发送给B
scp cacert.pem 192.168.1.6:/etc/httpd/conf.d/ssl/
# 将自签名证书发送给D(client)
scp cacert.pem 192.168.1.14:
五、在B上使用证书,以及实现HSTS
HSTS:HTTP Strict Transport Security。服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部跳转到HTTPS。
# 修改/etc/httpd/conf.d/ssl.conf文件中的三行
SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem
# http重定向https,创建/etc/httpd/conf.d/test.conf,内容如下
Header always set Strict-Transport-Security "max-age=15768000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]
# 重新加载http服务
service httpd reload
六、在D上测试
在D(client)上面,向火狐浏览器中导入证书cacert.pem,访问测试一下。
http://www.a.com
https://www.a.com
用上面两个都是可以的,最终效果图如下:
至此,https的简单实现介绍完毕,不足之处,请多指正。