实验目标:模拟颁发证书实现https访问,搭建负载均衡。
理论部分
1. SSL:安全套接字层
它是由Netscape公司于1994年创建,它旨在通过Web创建安全的Internet通信。
它是一种标准协议,用于加密浏览器和服务器之间的通信。它允许通过Internet安全轻松地传输账号密码、银行卡、手机号等私密信息。
2. SSL常见应用:
https:启用ssl加密的安全HTTP传输协议 443
ipsec vpn
3. PKI
公钥基础设施,主要功能是绑定证书持有者的身份和相关的密钥对(通过为公钥及相关的用户身份信息签发数字证书),为用户提供方便的证书申请、证书作废、证书获取、证书状态查询的途径,并利用数字证书及相关的各种服务(证书发布,黑名单发布,时间戳服务等),实现通信中各实体的身份认证、完整性、抗抵赖性和保密性。
4. 标准:x.509
CA:证书颁发机构
RA:证书注册机构
5. 证书的内容
申请者的公钥
申请者的身份标识
证书有效期
颁发者的标识
颁发者的签名
6. HTTPS证书的选择
专业版OV型 不显示企业名
高级版EV型 显示企业名
7. HTTPS证书购买选择
单域名:仅能绑定一个域名
多域名:能绑定五个域名
通配符域名:不限个数
8. HTTPS注意事项
https仅支持二级域名
https不支持续费,证书到期重新申请替换
https显示绿色,说明整个网站都是https的
https显示黄色,网站代码中包含https不安全链接
https显示红色,证书不认或过期
9. 企业内部实现https案例:
生成key密钥
生成证书签名请求文件(csr文件)
生成证书签名文件(ca文件)
实验部分
拓扑图如下:
环境搭建
打开四台centos虚拟机,两台搭建web,一台搭建负载均衡,一台只做客户端访问。
三台主机全都安装nginx,下面以web1为例。
1. [root@web1 ~]# rpm -ivh /media/nginx-rpm/* --nodeps --force 2. 3. [root@web1 ~]# systemctl start nginx 4. 5. [root@web1 ~]# systemctl enable nginx 6. 7. [root@web1 ~]# nginx -V //查看是否支持ssl需要有 --with-http_ssl_module模块
web1配置
1. 查看是否安装ssl,检查
如果没有安装可以直接yum安装。
1. [root@web1 ~]# rpm -qa openssl 2. 3. openssl-1.0.2k-25.el7_9.x86_64 4. 5. [root@web1 ~]# openssl version 6. 7. OpenSSL 1.0.2k-fips 26 Jan 2017
2. 创建私钥
创建ssl目录,本机当CA创建私钥。
1. [root@web1 ~]# mkdir -p /etc/nginx/ssl_key 2. 3. [root@web1 ~]# cd /etc/nginx/ssl_key/ 4. 5. [root@web1 ssl_key]# openssl genrsa -idea -out server.key 2048 6. 7. Generating RSA private key, 2048 bit long modulus 8. 9. .........................................................+++ 10. 11. .........................................+++ 12. 13. e is 65537 (0x10001) 14. 15. Enter pass phrase for server.key: //新建两次秘钥(4位) 16. 17. Verifying - Enter pass phrase for server.key: //第二次输入
3. 生成证书,去掉私钥的密码
生成证书过程中,需要添写国家、省、主机名、邮箱地址等,随便填写即可。
[root@web1 ssl_key]# openssl req -days 3650 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
4. 创建网站服务
编辑配置文件指定网站根目录,应用证书。
1. [root@web1 ssl_key]# cd /etc/nginx/conf.d/ 2. [root@web1 conf.d]# rm -rf default.conf 3. [root@web1 conf.d]# vim web.conf 4. server { 5. listen 443 ssl; 6. server_name www.benet.com; 7. ssl_certificate ssl_key/server.crt; 8. ssl_certificate_key ssl_key/server.key; 9. 10. 11. location / { 12. root /www; 13. index index.html; 14. } 15. } 16. [root@web1 conf.d]# mkdir /www 17. [root@web1 conf.d]# echo "192.168.1.4" > /www/index.html 18. [root@web1 conf.d]# systemctl restart nginx
5. 验证
登录客户机,修改hosts文件,访问https://www.benet.com。
[root@client ~]# echo "192.168.1.4 www.benet.com" >> /etc/hosts
修改后访问该网站,点击高级,点击接受风险并继续,就可以看到网站内容了。
6. rewrite地址重写
因为访问域名时需要添加https,需要将http重定向到https,之后就可以直接访问域名查看了。
1. [root@web1 conf.d]# vim web.conf 2. server { 3. listen 443 ssl; 4. server_name www.benet.com; 5. ssl_certificate ssl_key/server.crt; 6. ssl_certificate_key ssl_key/server.key; 7. 8. 9. location / { 10. root /www; 11. index index.html; 12. } 13. } 14. server { 15. listen 80; 16. server_name www.benet.com; 17. # rewrite .* https://https.benet.com; //下面四个都可以重定向,指定一条即可 18. # rewrite .* https://$host$request_uri redirect; 19. # rewrite .* https://$server_name$request_uri redirect; 20. rewrite .* https://$server_name$1 redirect; 21. } 22. [root@web1 conf.d]# systemctl restart nginx
现在直接访问www.benet.com就可以直接查看网页内容了。
配置负载均衡
经过上面的配置已经知道了证书的颁发及配置了,下面将配置负载均衡。
web2配置
因为web1已经配置,现在直接把秘钥目录和web.conf文件复制过来。
1. [root@web2 ~]# scp -rp root@192.168.1.4:/etc/nginx/* /etc/nginx/ 2. 3. [root@web2 ~]# cd /etc/nginx/conf.d/ 4. 5. [root@web2 conf.d]# rm -rf default.conf 6. 7. [root@web2 conf.d]# systemctl restart nginx 8. 9. [root@web2 conf.d]# mkdir /www 10. 11. [root@web2 conf.d]# echo "192.168.1.5" > /www/index.html
lb配置
1. lb也需要秘钥文件从web1复制过来。
1. [root@lb ~]# scp -rp root@192.168.1.4:/etc/nginx/ssl_key /etc/nginx/ 2. [root@lb ~]# cd /etc/nginx/conf.d/ 3. [root@lb conf.d]# rm -rf default.conf 4. [root@lb conf.d]# vim lb.conf 5. upstream web { 6. server 192.168.1.4:443; 7. server 192.168.1.5:443; 8. } 9. server { 10. listen 443 ssl; 11. server_name www.benet.com; 12. ssl_certificate ssl_key/server.crt; 13. ssl_certificate_key ssl_key/server.key; 14. 15. 16. location / { 17. proxy_pass https://web; 18. } 19. } 20. server { 21. listen 80; 22. server_name www.benet.com; 23. return 302 https://$server_name$1; 24. } 25. [root@lb conf.d]# systemctl restart nginx
2. 验证
修改测试机的hosts文件指定lb主机。
1. [root@client ~]# vim /etc/hosts 2. 3. 192.168.1.6 www.benet.com
访问www.benet.com,就可以查看到web1和web2的网站内容了。