Brc's blog
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于

Brc

努力中
首页
前端
后端
运维
  • 工作笔记
  • 分类
  • 标签
  • 归档
关于
  • Linux基础

  • Linux进阶

    • shell

    • nginx

      • nginx快速入门
      • LNMP架构
      • Nginx反向代理
      • Nginx七层负载均衡
      • Rewrite重写
      • HTTPS
        • HTTPS基本概述
          • 为什么要使用HTTPS
          • 什么是HTTPS
          • TLS/SSL是如何实现HTTP明文消息被加密的
        • HTTPS实现原理
          • HTTPS加密模型,对称加密以及非对称加密
          • Https通讯过程是如何验证双方的身份
          • HTTPS如何实现加密与解密
        • HTTPS注意事项
          • https证书都有哪些类型
          • HTTPS证书购买指南
          • HTTPS颜色提示
        • HTTPS单台配置实践
        • HTTPS集群配置实践
        • HTTPS优化配置实践
    • keepalived

    • LVS

    • ansible

    • docker

    • mysql

  • 其他

  • 运维
  • Linux进阶
  • nginx
Brc
2021-08-25
目录

HTTPS

# HTTPS基本概述

# 为什么要使用HTTPS

因为HTTP采用的是明文传输数据,那么在传输(账号密码、交易信息、等敏感数据)时不安全。容易遭到篡改,如果使用HTTPS协议,数据在传输过程中是加密的,能够有效避免网站传输时信息泄露。

# 什么是HTTPS

HTTPS安全的超文本传输协议,我们现在大部分站点都是通过HTTPS来实现站点数据安全。早期网景公司设计了SSL(Secure Socket Layer)安全套接层协议,主要用于对HTTP协议传输的数据进行加密。那如何将站点变成安全的HTTPS站点呢?我们需要了解SSL协议。

而现在很多时候我们在使用TLS(Transport Layer Security)传输层安全协议。HTTP Over TLS

image-20210825114202575

# TLS/SSL是如何实现HTTP明文消息被加密的

TLS/SSL协议工作在OSI七层模型中,应用层与传输层之间。

  • 提供数据安全:保证数据不会被泄露;
  • 提供数据的完整性︰保证数据在传输过程中不会被篡改;
  • 对应用层交给传输层的数据进行加密与解密;

image-20210825114249252

# HTTPS实现原理

# HTTPS加密模型,对称加密以及非对称加密

  • 对称加密,两个想通讯的人持有相同的秘钥,进行加密与解密。如下:

    • bob将原始文档通过秘钥加密生成一个密文文档。
    • alice拿到这个密文文档以后,它可以用这把秘钥还原为原始的明文文档。

    image-20210825114359183

    • 对称加密究竟是如何实现的,我们可以以RC4这样一个对称加密序列算法来看一下。

      • 加密∶秘钥序列+明文=密文

      • 解密∶秘钥序列+密文=明文

    image-20210825114453122

  • 非对称加密︰它根据一个数学原理,它会生成一对秘钥(公钥和私钥)公钥加密:私钥解密,只能实现单方向。

    • 私钥:私钥自己使用,不对外开放。

    • 公钥∶公钥给大家使用,对外开放。

    • 比如:alice有一对公钥和私钥,他可以将公钥发布给任何人。假设Bob是其中一个,当Bob要传递一份加密文档给Alice,那么Bob就可以用Alice的公钥进行加密,Alice收到密文文档后通过自己的私钥进行解密,获取原始文档。

    image-20210825114542073

    注意:Alice必须知道Bob就是Bob,也就是它收到的信息必须是Bob发来的,那么这个信任问题,在多方通讯的过程中,必须有一个公信机构来验证双方的身份,那么这个机构就是我们的CA机构。

# Https通讯过程是如何验证双方的身份

CA架构是可信任组织架构,主要用来颁发证书。那CA机构又是如何申请和颁发证书的呢?

image-20210825114621219

我们首先需要申请证书,需要进行登记,登记我是谁,我是什么组织,我想做什么,到了登记机构再通过CSR发给CA,CA中心通过后,CA中心会生成一对公钥和私钥,那么公钥会在CA证书链中保存,公钥和私钥证书订阅人拿到后,会将其部署在WEB服务器上。

  1. 当浏览器访问我们的https站点时,它会去请求我们的证书。
  2. Nginx会将我们的公钥证书回传给浏览器。
  3. 浏览器会去验证我们的证书是否是合法的、是否是有效的。
  4. CA机构会将过期的证书放置在CRL服务器,那么CRL服务的验证效率是非常差的,所以CA又推出了OCSP响应程序,OCSP响应程序可以查询指定的一个证书是否过期,所以浏览器可以直接查询OCSP响应程序,但OCSP响应程序性能还不是很高。
  5. Nginx会有一个OCSP的开关,当我们开启后,Nginx会主动上OCSP上查询,这样大量的客户端直接从Nginx获取证书是否有效。

# HTTPS如何实现加密与解密

image-20210825133151686

HTTPS加密过程,HTTPS采用混合加密算法,即对称加密、和非对称加密。

通信前准备工作:申请域名对应的证书,并将其部署在Nginx服务器中。

  1. 第一步客户端向服务端发送Client Hello消息,这个消息里包含了一个客户端生成的随机数Random1、客户端支持的加密套件和客户端支持TLS协议版本等信息。
  2. 服务端会向客户端发送Server Hello消息。返回自己的公钥证书、挑选一个合适的加密套件、另外还会生成一份随机数Random2推送给客户端。至此客户端和服务端都拥有了两个随机数(Random1+Random2)
  3. 客户端收到服务端传来的公钥证书后,先从CA验证该证书的合法性(CA公钥去解密公钥证书),验证通过后取出证书中的服务端公钥,再生成一个随机数Random3,再用服务端公钥非对称加密Random3。
  4. 服务端用自己的私钥解出客户端生成的Random3。至此,客户端和服务端都拥有Random1+Random2+Random3,两边根据同样的算法生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。

# HTTPS注意事项

# https证书都有哪些类型

image-20210825133309343

# HTTPS证书购买指南

  • 保护1个域名www
  • 保护5个域名www、images、cdn、test、m
  • 通配符域名*.birenchong.cn

# HTTPS颜色提示

  • https不支持续费,证书到期需重新申请新并进行替换;
  • https不支持三级域名解析,如test.m.xu.com;
  • https显示绿色,说明整个网站的url都是https的,并且都是安全的;
  • https显示黄色,说明网站代码中有部分URL地址是http不安全协议的;
  • https显示红色,要么证书是假的,要么证书已经过期;

# HTTPS单台配置实践

  1. 环境准备

    [root@web01 ~]# mkdir -p /etc/nginx/ssl_key
    [root@web01 ~]# cd /etc/nginx/ssl_key
    
    1
    2
  2. 使用openssl命令充当CA权威机构创建证书(生产不使用此方式生成证书,不被互联网认可的黑户证书)

    [root@web01 ssh_key]# openssl genrsa -idea -out server.key 2048
    Generating RSA private key,2048 bit long modulus
    .....+++
    # 记住配置密码,我这里是1234
    Enter pass phrase for server.key:
    verifying - Enter pass phrase for server.key :
    
    1
    2
    3
    4
    5
    6
  3. 生成自签证书,同时去掉私钥的密码

    [root@web01 ssl_key]# openssl req -days 36500 -x509\
    -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
    
    Country Name (2 letter code)[XX]:CN				# 国家
    State or Province Name (full name)[]:WH			# 省
    Locality Name (eg, city)[Default City]: WH		# 城市
    organization Name (eg,company)[Default Company Ltd]:edu 	# 公司
    organizational Unit Name (eg, section)[]:birenchong			# 单位
    Common Name (eg,your name or your servers hostname)[]:s.birenchong.cn	# 服务器主机名称
    Email Address []:2411776061@qq.com
    
    # req	-->用于创建新的证书
    # days	-->表示证书的有效期
    # x509	-->表示定义证书的格式为标准格式
    # new	-->表示创建的是新证书
    # key	-->表示调用的私钥文件信息
    # out	-->表示输出证书文件信息
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  4. 证书申请完成后需要了解Nginx如何配置https

    # 官方示例
    
    worker_processes auto;
    
    http {
        ...
        server {
            listen				443 ssl;
            keepalive_timeout	70;
            ssl_protocols		TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers			AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
            ssl_certificate/usr /local/nginx/conf/cert.pem;
            ssl_certificate_key /usr/local/nginx/conf/cert.key;
            ssl_session_cache shared:SSL:10m;
            ssl_session_timeout 10m;
            ...
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
  5. 配置Nginx配置https实例

    [root@web01 ~]# cat /etc/nginx/conf.d/s.birenchong.cn.conf
    server {
        listen 443 ssl;
        server_name s.birenchong.cn;
        ssl on;
        ssl_certificate	ssl_key/server.crt;
        ssl_certificate_key ssl_key/server.key;
        location / {
            root /code;
            index index.html;
        }
    }
    
    # 准备对应的站点目录,并重启Nginx服务
    [root@web01 ~]# mkdir -p /code
    [root@web01 ~]# echo "https" > /code/index.html
    [root@web01 ~]# systemctl restart nginx
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  6. 浏览器输入https://s.birenchong.cn访问,由于该证书非第三方权威机构颁发,而是我们自己签发的,所以浏览器会警告

  7. 以上配置如果用户忘记在浏览器地址栏输入https://那么将不会跳转至https,建议配置将用户访问http请求强制跳转https

    [root@nginx ~]# cat /etc/nginx/conf.d/ssl.conf
    server {
        listen 443;
        server_name s.birenchong.cn;
        ssl on;
        ssl_certificate ssl_key/server.crt;
        ssl_certificate_key ssl_key/server.key;
    
        location / {
            root /code;
            index index.html;
        }
    }
    
    server {
        listen 80;
        server_name s.birenchong.cn;
        return 302 https://$server_name$request_uri;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

# HTTPS集群配置实践

Nginx负载均衡+Nginx WEB配置HTTPS安全

image-20210825133558735

  1. 环境准备

    角色 主机名 外网IP(NAT) 内网IP(LAN)
    Proxy proxy01 eth0:10.0.0.5 eth1:172.16.1.5
    web01 web01 eth0:10.0.0.7 eth1:172.16.1.7
    web02 web02 eth0:10.0.0.8 eth1:172.16.1.8
  2. 配置后端两台web节点监听80端口,如已配置则无需修改

    [root@web01 conf.d]# cat s.birenchong.cn.conf
    server {
        listen 80;
        server_name s.birenchong.cn;
        root /code/wordpress;
    
        location / {
            index index.html;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  3. 配置第二台web节点

    [root@web02 conf.d]# cat s.birenchong.cn.conf
    server {
        listen 80;
        server_name s.birenchong.cn;
        root /code/wordpress;
    
        location / {
            index index.html;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  4. 重启两台后端web节点Nginx

    [root@web01 ~]# systemctl restart nginx
    [root@web02 ~]# systemctl restart nginx
    
    1
    2
  5. Nginx负载均衡先生成证书

    [root@proxy01 ~]# mkdir /etc/nginx/ssl_key -p
    [root@proxy01 ~]# cd /etc/nginx/ssl_key
    [root@proxy01 ~]# openssl genrsa -idea -out server.key 2048
    [root@proxy01 ~]# openssl req -days 36500-x509 -sha256 \
    -nodes -newkey rsa:2048 -keyout server.key -out server.crt
    
    1
    2
    3
    4
    5
  6. Nginx负载均衡配置文件如下

    [root@proxy01 ~]# cat /etc/nginx/conf.d/proxy.conf
    # 定义后端资源池
    upstream site {
        server 172.16.1.7:80 max_fails=2 fail_timeout=10s;
        server 172.16.1.8:80 max_fails=2 fail_timeout=10s;
    }
    
    # https配置
    server {
        listen 443;
        server_name s.birenchong.cn;
        ssl on;
        ssl_certificate ssl_key/server.crt;
        ssl_certificate_key ssl_key/server.key;
        location / {
            proxy_pass http:/lsite;
            include proxy_params;
        }
    }
    
    # 用户http请求跳转至https
    server {
        listen 80;
        server_name s.birenchong.cn;
        return 302 https://$server_name$request_uri;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
  7. 重启Nginx负载均衡

    [root@proxy01 ~]# nginx -t
    [root@proxy01 ~]# systemctl restart nginx
    
    1
    2

PS:如果要将wordpress的http方式改造为https方式,可能会造成页面加载不成功或着无法登陆。

# web节点增加此参数
location ~ \.php$ {
	...
	fastcgi_param HTTPS on;
	...
}
1
2
3
4
5
6

# HTTPS优化配置实践

SSL的运行计算需要消耗额外的CPU资源,SSL通讯过程中"握手"阶段的运算最占用CPU资源,有如下几个方面可以进行调整与优化。

  1. 设置worker进程数设置为等于CPU处理器的核心数。worker_processes auto;

  2. 启用keepalive长连接,一个连接发送更多个请求。

  3. 启用shared会话缓存,所有worker工作进程之间共享的缓存,避免进行多次SSL“握手”。

  4. 禁用builtin内置于OpenSSL中的缓存,仅能供一个worker工作进程使用。[使用shared缓存即禁止builtin]

worker_processes auto;

http {
	...
    server {
        listen 443 ssl;
        server_name www.example.com;
        ssl_certificate		www.example.com.crt;
        ssl_certificate_key www.example.com.key;
        ssl_protocols		TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;		# Nginx决定使用哪些协议与浏览器进行通讯

        keepalive_timeout	70;				# 设置长连接
        # 建立握手后如果连接断开,在session_timeout时间内再次连接,无需再次建立握手,可直接复用之间缓存的连接。
        ssl_session_cache	shared:SSL:10m;	# 1M缓存空间能存储4000个会话数量
        ssl_session_timeout 1440m;			# 配置会话超时时间(默认5分钟)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#nginx#HTTPS
Last Updated: 2022/03/30, 11:09:09
Rewrite重写
高可用keepalived

← Rewrite重写 高可用keepalived→

最近更新
01
谷歌云创建GKE集群
07-26
02
ElastiCacheForRedis启用密码
07-26
03
upload-to-gcs
06-29
更多文章>
Theme by Vdoing | Copyright © 2021-2024 Brc | MIT License | 浙ICP备19031881号-4
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式