HTTPS协议详解

HTTPS安全证书基本概述

  • 为什么需要使用HTTPS,因为HTTP不安全。当我们使用HTTP网站时,会遭到劫持和篡改,如果采用HTTPS协议,那么数据在传输的过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。
    在这里插入图片描述

场景模拟

  1. 正常访问情况(本地hosts文件代替DNS解析服务)
- web01服务器
3. 修改Nginx配置文件
vim /etc/nginx/conf.d/test.nana.com.conf
server {
        listen 80;
        server_name test.nana.com;
        charset utf-8,gbk;
        root /soft/code;
        index index.html;
}

4. 创建Nginx配置文件指定的数据信息
vim /soft/code/index.html
<h1>Nginx01</h1>
<h2>Nginx01</h2>
<h3>Nginx01</h3>

- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.7 test.nana.com

我们打开浏览器输入test.nana.com;可以看到三个字体大小不一致的Nginx01
  1. DNS数据被劫持的情况
- lb01服务器
1. 修改Nginx配置文件
vim proxy_test.conf
upstream test {
        server 172.16.1.7:80;
}

server {
        listen 80;
        server_name test.nana.com;

        location / {
                proxy_pass http://test;
                proxy_set_header Host $http_host;
                sub_filter "<h3>" "<h1>";			# 将Nginx配置文件中<h3>替换成<h1>
                # sub_filter模块可以实现Nginx数据替换
                sub_filter "</h3>" "</h1>";			# 将Nginx配置文件中</h3>替换成</h1>
        }
}
  
- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.5 test.nana.com

我们打开浏览器输入test.nana.com;可以看到的Nginx01字体格式跟之前的字题格式不一样了

对称加密与非对称加密

  • 对称加密比较简单,就是客户端和服务器共用同一个密钥,该密钥可以用于加密一段内容,同时也可以用于解密这段内容。对称加密的优点是加解密效率高,但是在安全性方面可能存在一些问题,因为密钥存放在客户端有被窃取的风险。

  • 非对称加密则要复杂一点,它将密钥分成了两种:公钥和私钥。公钥通常存放在客户端,私钥通常存放在服务器。使用公钥加密的数据只有用私钥才能解密,反过来使用私钥加密的数据也只有用公钥才能解密。非对称加密的优点是安全性更高,因为客户端发送给服务器的加密信息只有用服务器的私钥才能解密,因此不用担心被别人破解,但缺点是加解密的效率相比于对称加密要差很多。

https使用的是对称加密与非对称加密相结合的方式。

TLS加密协议

  • 我们在实现Https时,需要了解ssl协议,但是我们现在使用更多的是TLS加密协议。
    那么TLS是怎么保证明文消息被加密的呢?在OSI七层模型中,应用性是http协议,那么应用层协议下,我们的表示层,是ssl协议所发挥作用的一层,它通过(握手,交换秘钥,告警,加密)等方式,是应用层http协议在没有感知的情况下做到了数据的安全加密。
    在这里插入图片描述
    那么在数据进行加密与解密的过程中,如何让确定双方的身份,此时就需要一个权威机构来验证双方身份。那么这个权威机构则是CA机构。那么CA机构又是如何让颁发证书的。
    在这里插入图片描述

首先我们需要申请证书,需要进行登记,并且提交自己的公钥,到了登记机构再通过CRS发给CA。CA机构则会使用我们提交的公钥,再加上一系列其他的信息,如网站域名、有效时长等,来制作证书。CA中心证书制作完成后,CA机构会使用自己的私钥对其加密,并将加密后的数据返回给我们,证书订阅人拿到加密过公钥证书后,会直接将证书(CA机构私钥加密过的证书)部署在WEB服务器上。

  1. 当浏览器访问我们的https站点时,它会去请求我们的证书
  2. Nginx这样的Web服务器会将我们的公钥证书颁发给浏览器
  3. 浏览器会用CA机构的公钥(任何正版操作系统都会将所有主流CA机构的公钥内置到操作系统当中)解开经过CA私钥加密过的证书。然后去CA机构(CRL和OCSP)验证证书是否合法、有效。浏览器通过CA证书中服务器的公钥与服务端建立连接后,后续的通信用的是对称加密。
  4. CA机构会将过去的证书放置在CRL服务器,那么CRL服务器验证的效率是非常差的,所以CA又推出了OCSP响应程序,OCSP响应程序可以查询指定的一个证书是否过期,所以浏览器可以直接查询OCSP响应程序,但OCSP响应程序性能还不是很高。
  5. Nginx会有一个OCSP的开关,当我们开启后,Nginx会主动上OCSP上查询,这样大量的客户端直接从Nginx获取,证书是否有效。

CA证书的类型

在这里插入图片描述

HTTPS证书的购买选择

  • 保护1个域名,例如 : www.nana.com(保护1个二级域名)
  • 保护5个域名,例如:www.nana.com;a.nana.com(保护5个二级域名)
  • 通配符域名,例如:www.nana.com(保护*.nana.com个二级域名)

HTTPS注意事项

  1. Https不支持续费,证书到期需要重新申请并进行替换
  2. Https不支持三级域名解析,比如test.a.nana.com
  3. Https显示绿色,说明整个网站的url都是https的
  4. Https显示黄色,因为网站代码中包含http的不安全链接
  5. Https显示红色,要么证书是假的,要么证书过期

Nginx Https实战

1.模拟申请CA证书

  1. 环境准备
- nginx必须有ssl模块
nginx -V
# --with-http_ssl_module

- 创建存放ssl证书的路径
mkdir -p /etc/nginx/ssl_key
cd /etc/nginx/ssl_key
  1. 使用openssl命令充当CA权威机构创建证书(生产环境中不使用此方式生产证书,不被互联网认可的黑户证书)
openssl genrsa -idea -out server.key 2048
# 使用命令后,输入密码
  1. 生成自签证书,同时去掉私钥的密码
openssl req -days 36500 -x509 \-sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
# 信息随便填就好

# req	用于创建的证书
# new	表示创建的是新证书
# x509	表示定义证书的格式为标准格式
# key	表示调用的私钥文件信息
# out	表示输出证书文件信息
# days	表示证书的有效期

ls /etc/nginx/ssl_key
# server.crt(公钥文件)  server.key(私钥文件)

配置单台Nginx支持Https协议

- Web01服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/s.nana.com

server {
        listen 443 ssl;						# https默认的监听端口443,ssl表示启用https协议
        server_name s.nana.com;
        root /code;
        ssl_certificate ssl_key/server.crt;				# https协议的公钥文件路径 
        ssl_certificate_key ssl_key/server.key;			# https协议的私钥文件路径

        location /{
                index index.html;
        }
}

# 将http协议跳转至https协议
server {
        listen 80;
        server_name s.nana.com;
        return 302 https://$server_name$request_uri;
        # 302 每次请求都会询问服务器
}


2. 创建Nginx配置文件指定的数据信息
echo "Test Https" > /code/index.html

3. 重启Nginx服务
systemctl restart nginx

- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.7	 s.nana.com

我们打开浏览器输入s.nana.com会跳转至https://s.nana.com,并且会跳出一个不安全的红色警告。点击高级,访问页面显示Test Https。

Nginx集群实现Https实践

在这里插入图片描述

Web01服务器

1. 修改Nginx配置文件
vim /etc/nginx/conf.d/s.nana.conf
server {
        listen 80;
        server_name s.nana.com;
        root /code;

        location /{
                index index.html;
        }
}

2. 创建Nginx配置文件指定的数据信息
echo "Web01 Https" > /code/index.html

3. 重启Nginx服务
systemctl restart nginx

Web02服务器

1. 修改Nginx配置文件
vim /etc/nginx/conf.d/s.nana.conf
server {
        listen 80;
        server_name s.nana.com;
        root /code;

        location /{
                index index.html;
        }
}

2. 创建Nginx配置文件指定的数据信息
echo "Web02 Https" > /code/index.html

3. 重启Nginx服务
systemctl restart nginx

负载均衡服务器

1. 修改Nginx配置文件
vim /etc/nginx/conf.d/proxy_s.conf
upstream website {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
}

server {
        listen 443 ssl;
        server_name s.nana.com;
        ssl_certificate  ssl_key/server.crt;
        ssl_certificate_key  ssl_key/server.key;

        location / {
                proxy_pass http://website;
                proxy_set_header Host $http_host;
        }
}

server {
        listen 80;
        server_name s.nana.com;
        return 302 https://$server_name$request_uri;
}

2. 创建公钥与私钥文件
scp -rp 172.16.1.7:/etc/nginx/ssl_key ./

3. 重启服务
systemctl restart nginx

- 测试
在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析(注释掉本机其他ip与域名之间的对应关系)
192.168.15.5	 s.nana.com

我们打开浏览器输入s.nana.com会跳转至https://s.nana.com,可以实现页面跳转Web01 Https ; Web02 Https。

案例

我们基于七层负载的Wordpress服务和WeCenter服务,实现进行配置HTTPS协议跳转

web服务器

Wordpress服务(web01服务器,web02服务器均用以下配置)

- Wordpress服务
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/blog.nana.com.conf 
server {
        listen 80;
        server_name blog.nana.com;
        root /code/wordpress;
        client_max_body_size 100m;

        location / {
                index index.php index.html;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param HTTPS on;				
                # Nginx支持https的配置时,需要在php区域配置中添加fastcgi服务,否则https不支持php文件
                # 如果是http协议,不可以加这个参数
                include fastcgi_params;
        }
}

2. 重启服务
systemctl restart nginx

WeCenter服务(web01服务器,web02服务器均用以下配置)

- WeCenter服务
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/zh.nana.com.conf
server {
        listen 80;
        server_name zh.nana.com;
        root /code/zh;
        client_max_body_size 100m;

        location / {
                index index.php index.html;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param HTTPS on;
                # Nginx支持https的配置时,需要在php区域配置中添加fastcgi服务,否则https不支持php文件
                # 如果是http协议,不可以加这个参数
                include fastcgi_params;
        }
}

2. 重启服务
systemctl restart nginx

负载均衡服务器

lb01服务器

vim /etc/nginx/conf.d/proxy_nana.com.conf
upstream node {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
        }

server {
        listen 80;
        server_name blog.nana.com;
        return 302 https://$server_name$request_uri;
        }

server {
        listen 443 ssl;
        server_name blog.nana.com;
        ssl_certificate  ssl_key/server.crt;
        ssl_certificate_key  ssl_key/server.key;

        location / {
                proxy_pass http://node;
                include proxy_params;
        }
}

server {
        listen 80;
        server_name zh.nana.com;
        return 302 https://$server_name$request_uri;
        }

server {
        listen 443 ssl;
        server_name zh.nana.com;
        ssl_certificate  ssl_key/server.crt;
        ssl_certificate_key  ssl_key/server.key;

        location / {
                proxy_pass http://node;
                include proxy_params;
        }
}

2. 重启服务
systemctl restart nginx

我们基于七层负载的Phpmyadmin服务,实现进行配置HTTPS协议跳转

web服务器

Phpmyadmin服务(web01服务器,web02服务器均用以下配置)

- web01服务器
vim /etc/nginx/conf.d/php.conf 
server {
        listen 80;
        server_name php.nana.com;
        root /code/phpMyAdmin-5.1.0-all-languages;

        location / {
                index index.php index.html;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param HTTPS on;
                # Nginx支持https的配置时,需要在php区域配置中添加fastcgi服务,否则https不支持php文件
                # 如果是http协议,不可以加这个参数
                include fastcgi_params;
        }
}

2. 重启Nginx服务
systemctl restart nginx

负载均衡服务器

- lb01服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/proxy_php.conf
upstream php {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
        }

server {
        listen 80;
        server_name php.nana.com;
        return 302 https://$server_name$request_uri;
        }

server {
        listen 443 ssl;
        ssl_certificate  ssl_key/server.crt;
        ssl_certificate_key  ssl_key/server.key;
        server_name php.nana.com;

        location / {
                proxy_pass http://php;
                include proxy_params;
        }
}

2. 重启Nginx服务
systemctl restart nginx

测试

  • 我们打开浏览器,用HTTP协议访问配置好的服务域名,浏览器会跳转到HTTPS协议进行页面展示。

生产环境单台主机配置HTTPS

- 负载均衡服务器
1. 修改Nginx配置文件
vim /etc/nginx/conf.d/blog_nana.com.conf
upstream node {
        server 172.16.1.7:80;
        }

server {
    listen 443 ssl;
    server_name blog.nana.com;
    ssl_certificate  ssl_key/server.crt;
    ssl_certificate_key  ssl_key/server.key;

	ssl_session_cache shared:SSL:10m;
	# 在建立完ssl握手后如果断开连接,在session_time时间内再次连接,是不需要再次建立握手,可以复用之前的连接
	ssl_session_timeout  100m;    		# ssl连接断开后的超时时间
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    	# 使用的TLS版本协议
	ssl_prefer_server_ciphers on;   		# Nginx决定使用哪些协议与浏览器进行通讯
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    # 加密算法

    location / {
            proxy_pass http://node;
            include proxy_params;
    }
}

server {
        listen 80;
        server_name blog.nana.com;
        return 302 https://$server_name$request_uri;
        }

2. 重启Nginx服务
systemctl restart nginx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值