WEB服务是互联网最常见的服务类型,随着技术的发展,安全是对用户来说头等大事,下面实验简单的还原了一下现在互联网最流行HTTPS的实现。

实验目的:

  1. 实现域名访问网页(DNS解析);

  2. HTTPS的实现(私建CA,实现自签和证书颁发);

  3. 实现HTTP重定向HTTPS,HSTS;

实验准备:

前提:所有主机关闭防火墙和SELINUX。

  1. HTTP SERVER:192.168.32.9,centos6.9;

  2. DNS SERVER:192.168.32.111,centos7.3;

  3. CA:192.168.32.111,centos7.3;

  4. CLIENT:192.168.32.101,centos6.9;

搭建HTTP服务:

  1. 安装HTTP服务,也可以使用rpm或者自己编译安装

]#yum install httpd -y

2.启动服务,开机自启

]#service httpd start
]#chkconfig httpd on

3.ss -tan查看80端口是否开启

4.添加主页文件

]#cd /var/www/html
]#vim index.html
/var/www/html/
:wq

5.重启服务,本机测试

wKiom1nOLrSRtrsLAAAYiTOijVw436.png-wh_50 

搭建DNS服务器

  1. 安装包,启动服务并设置开机自启

]#yum install bind -y
]#systemctl enable named
]#systemctl start named

2.ss -tan查看53端口是否开启

3.修改主配置文件,不绑定固定端口监听

]#vim /etc/named.conf
  listen-on port 53 { any; };
  allow-query   { any; };

4.添加要解析的域名

]#vim /etc/named.rfc1912.zones
zone "a.com" IN {
        type master;
        file "a.com.zone";
};

5.添加解析库文件

]#vim /var/named/a.com.zone
$TTL 1D
@       IN SOA  dns1   admin.xiaomage.com. (
                  31      ; serial
                  1D      ; refresh
                  1H      ; retry
                  1W      ; expire
                  3H )    ; minimum
            NS   dns1
dns1     IN   A       92.168.32.111
websrv     IN   A       192.168.32.9
www     IN  CNAME      websrv

注意权限
]#chown named:named a.com.zone

6.重启服务后 本机测试,修改本机DNS指向搭建的DNS地址

wKioL1nONOnwJ-eVAAAX2feJi3c358.png-wh_50

CA的搭建

1.生成私钥

]#touch /etc/pki/CA/index.txt 
]#echo 01 > /etc/pki/CA/seria
]#(umask066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

2.生成自签名证书

]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
]#openssl x509 -in cacert.pem -noout -text   <===以文本形式查看证书

3.web服务器申请证书

]#/etc/httpd/conf.d/ssl
]#cat /etc/pki/tls/openssl.cnf   <===默认前三项必须和CA证书相同,可以进行修改。
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
]#openssl req -new -key httpd.key -out httpd.csr

4. 传到CA服务器进行签名

]#/etc/pki/CA
]#scp httpd.csr 192.168.32.111:/etc/pki/CA/
]#openssl ca -in httpd.csr -out httpd.crt -days 360
]#scp httpd.crt 192.168.32.9:/etc/httpd/conf.d/ssl/    <===传给服务器

5.安装加密模块mod_ssl

]#yum install -y mod_ssl
]#rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem

现在可以先访问看看,是不信任的。当然可以点继续浏览此网站。

wKioL1nOULTTFTXMAABsak9Xx-g944.jpg-wh_50wKiom1nOUWiyadGnAAAaHmHcNb4029.jpg

6.配置mod_ssl配置文件

]#vim /etc/httpd/conf.d/ssl.conf
 SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt        <===证书路径
 SSLCertificateChainFile /etc/httpd/conf.d/ssl/httpd.key        <===密钥路径
 SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem              <===CA证书

7.重启服务,可以看到443端口打开了

]#service httpd reload
]#ss -tanl
LISTEN      0      128                     :::80                     :::*     
LISTEN      0      128                     :::443                    :::*

8.将根证书安装到受信任的根证书颁发机构中,再次打开该网站已经是受信任的HTTPS访问啦。

wKiom1nOTqTTSKReAABIujOOYXk491.jpg-wh_50

现在还有一个问题,我手动输入http://www.a.com还是继续能访问,而很多网站是手动输入www.a.com就可以直接跳转到加密网站的,而且网名们上网是不会去手动输入前缀的。

wKioL1nOU3DiVTxEAAAg6yZYVCk388.png

上图两个地址是区分开来,可以通过HTTP重定向到HTTPS来完成自动跳转。

HTTP重定向;

]#vim /etc/httpd/conf.d/test.conf 
redirect temp / https://www.a.com/
测试
]#curl http://www.a.com 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://www.a.com/">here</a>.</p>
<hr>
<address>Apache Server at www.a.com Port 80</address>
</body></html>

在实际场景中,通过http跳转https是企业跳转是比较常见的,首先CLIENT发一个HTTP请求给SERVER,SERVER返回一个响应你要访问HTTPS,然后CLIENT再次发送HTTPS的请求,SERVER返回请求数据。这样的通讯进行了四次,比较浪费资源,给服务器带增加负担。于是就产生了HSTS,原理是服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS。而无需任何网络过程。

HTST实现:

]#vim /etc/httpd/conf/httpd.conf
Header always set Strict-Transport-Security "max-age=15768000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]