1.HTTPS安全证书基本概述

为什么需要使用HTTPS, 因为HTTP不安全。当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。
那么我们在实现https时,需要了解ssl协议,但我们现在使用的更多的是TLS加密协议。
那么TLS是怎么保证明文消息被加密的呢?在OSI七层模型中,应用层是http协议,那么在应用层协议之下,我们的表示层,是ssl协议所发挥作用的一层,它通过(握手、交换秘钥、告警、加密)等方式,使应用层http协议没有感知的情况下做到了数据的安全加密

11.Nginx HTTPS 实践 - 图1
那么在数据进行加密与解密过程中,如何确定双方的身份,此时就需要有一个权威机构来验证双方省份。那么这个权威机构则是CA机构。那CA机构又是如何颁发证书
11.Nginx HTTPS 实践 - 图2
我们首先需要申请证书,需要进行登记,登记我是谁,我是什么组织,我想做什么,到了登记机构在通过CSR发给CA,CA中心通过后,CA中心会生成一对公钥和私钥,那么公钥会在CA证书链中保存,公钥和私钥证书订阅人拿到后,会将其部署在WEB服务器上
1.当浏览器访问我们的https站点时,它会去请求我们的证书
2.Nginx这样的web服务器会将我们的公钥证书发给浏览器
3.浏览器会去验证我们的证书是否是合法和有效的。
4.CA机构会将过期的证书放置在CRL服务器,那么CRL服务的验证效率是非常差的,所以CA又推出了OCSP响应程序,OCSP响应程序可以查询指定的一个证书是否过期,所以浏览器可以直接查询OCSP响应程序,但OCSP响应程序性能还不是很高。
5.Nginx会有一个OCSP的开关,当我们开启后,Nginx会主动上OCSP上查询,这样大量的客户端直接从Nginx获取,证书是否有效。

那么证书究竟是怎样组成的呢,接下来我们看一下证书有哪几种类型?
11.Nginx HTTPS 实践 - 图3
HTTPS证书购买选择
保护1个域名 www
保护5个域名 www images cdn test m
通配符域名 *.oldboy.com

HTTPS注意事项
Https不支持续费,证书到期需重新申请新并进行替换.
Https不支持三级域名解析, 如test.m.oldboy.com
Https显示绿色, 说明整个网站的url都是https的。
Https显示黄色, 因为网站代码中包含http的不安全连接。
Https显示红色, 要么证书是假的,要么证书过期。

2.Nginx单台实现HTTPS实战

1.环境准备

  1. #nginx必须有ssl模块
  2. [root@Nginx ~]# nginx -V
  3. --with-http_ssl_module
  4. #创建存放ssl证书的路径
  5. [root@Nginx ~]# mkdir -p /etc/nginx/ssl_key
  6. [root@Nginx ~]# cd /etc/nginx/ssl_key

2.使用openssl命令充当CA权威机构创建证书(生产不使用此方式生成证书,不被互联网认可的黑户证书)

  1. [root@Nginx ssh_key]# openssl genrsa -idea -out server.key 2048
  2. Generating RSA private key, 2048 bit long modulus
  3. .....+++
  4. #记住配置密码, 我这里是1234
  5. Enter pass phrase for server.key:
  6. Verifying - Enter pass phrase for server.key:

3.生成自签证书,同时去掉私钥的密码

  1. [root@Nginx ssl_key]# openssl req -days 36500 -x509 \
  2. -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
  3. Country Name (2 letter code) [XX]:CN
  4. State or Province Name (full name) []:WH
  5. Locality Name (eg, city) [Default City]:WH
  6. Organization Name (eg, company) [Default Company Ltd]:edu
  7. Organizational Unit Name (eg, section) []:SA
  8. Common Name (eg, your name or your servers hostname) []:bgx
  9. Email Address []:bgx@foxmail.com
  10. # req -->用于创建新的证书
  11. # new -->表示创建的是新证书
  12. # x509 -->表示定义证书的格式为标准格式
  13. # key -->表示调用的私钥文件信息
  14. # out -->表示输出证书文件信息
  15. # days -->表示证书的有效期

4.证书申请完成后需要了解Nginx如何配置Https

  1. #启动ssl功能
  2. Syntax: ssl on | off;
  3. Default: ssl off;
  4. Context: http, server
  5. #证书文件
  6. Syntax: ssl_certificate file;
  7. Default:
  8. Context: http, server
  9. #私钥文件
  10. Syntax: ssl_certificate_key file;
  11. Default:
  12. Context: http, server

5.配置Nginx配置Https实例

  1. [root@Nginx ~]# cat /etc/nginx/conf.d/ssl.conf
  2. server {
  3. listen 443;
  4. server_name s.oldboy.com;
  5. ssl on;
  6. ssl_certificate ssl_key/server.crt;
  7. ssl_certificate_key ssl_key/server.key;
  8. location / {
  9. root /code;
  10. index index.html;
  11. }
  12. }
  13. #准备对应的站点目录, 并重启Nginx服务
  14. [root@Nginx ~]# mkdir -p /code
  15. [root@Nginx ~]# echo "Https" > /code/index.html
  16. [root@Nginx ~]# systemctl restart nginx

6.浏览器输入[https://s.oldboy.com](https://s.oldboy.com)访问, 由于该证书非第三方权威机构颁发,而是我们自己签发的,所以浏览器会警告
11.Nginx HTTPS 实践 - 图4
7.以上配置如果用户忘记在浏览器地址栏输入 https:// 那么将不会跳转至https,建议配置将用户访问 http请求强制跳转https

  1. [root@Nginx ~]# cat /etc/nginx/conf.d/ssl.conf
  2. server {
  3. listen 443;
  4. server_name s.oldboy.com;
  5. ssl on;
  6. ssl_certificate ssl_key/server.crt;
  7. ssl_certificate_key ssl_key/server.key;
  8. location / {
  9. root /code;
  10. index index.html;
  11. }
  12. }
  13. server {
  14. listen 80;
  15. server_name s.oldboy.com;
  16. rewrite ^(.*) https://$server_name$1 redirect; #rewrite跳转方式
  17. #return 302 https://$server_name$request_uri; #return跳转方式
  18. }

3.Nginx集群实现HTTPS实践

实战Nginx负载均衡+Nginx WEB配置HTTPS安全
11.Nginx HTTPS 实践 - 图5
1) 环境准备

主机名 外网IP(NAT) 内网IP(LAN) 角色
lb01 eth0:10.0.0.5 eth1:172.16.1.5 nginx-proxy
web01 eth0:10.0.0.7 eth1:172.16.1.7 nginx-web01
web02 eth0:10.0.0.8 eth1:172.16.1.8 nginx-web02

2) 配置后端两台web节点监听80端口, 如已配置则无需修改

  1. [root@web01 conf.d]# cat blog.oldboy.com.conf
  2. server {
  3. listen 80;
  4. server_name blog.oldboy.com;
  5. root /code/wordpress;
  6. index index.php index.html;
  7. location ~ \.php$ {
  8. root /code/wordpress;
  9. fastcgi_pass 127.0.0.1:9000;
  10. fastcgi_index index.php;
  11. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  12. include fastcgi_params;
  13. }
  14. }

3) 配置第二台web节点

  1. [root@web02 ~]# yum install -y nginx
  2. [root@web01 ~]# scp -rp /etc/nginx/ssl_key/ root@172.16.1.8:/etc/nginx/
  3. [root@web01 ~]# scp -rp /etc/nginx/conf.d/ root@172.16.1.8:/etc/nginx/

4) 重启两台后端web节点Nginx

  1. [root@web01 ~]# systemctl restart nginx
  2. [root@web02 ~]# systemctl restart nginx

5) Nginx负载均衡先生成证书

  1. [root@lb01 ~]# mkdir /etc/nginx/ssl_key -p
  2. [root@lb01 ~]# cd /etc/nginx/ssl_key
  3. [root@lb01 ~]# openssl genrsa -idea -out server.key 2048
  4. [root@lb01 ~]# openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt

6) Nginx负载均衡配置文件如下

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

7) 重启Nginx 负载均衡

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

8) wordpress早期安装如果是使用http方式, 那开启https后会导致, wordpress出现加载或无法登陆问题。

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

4.阿里云Nginx实现HTTPS实践

在云上签发各品牌数字证书,实现网站HTTPS化,使网站可信,防劫持、防篡改、防监听。并进行统一生命周期管理,简化证书部署,一键分发到云上产品
11.Nginx HTTPS 实践 - 图6
11.Nginx HTTPS 实践 - 图7
11.Nginx HTTPS 实践 - 图8
11.Nginx HTTPS 实践 - 图9
11.Nginx HTTPS 实践 - 图10
11.Nginx HTTPS 实践 - 图11
上传阿里云证书, 并解压

  1. [root@Nginx ssl_key]# rz
  2. rz waiting to receive.
  3. Starting zmodem transfer. Press Ctrl+C to cancel.
  4. Transferring 1524377920931.zip...
  5. 100% 3 KB 3 KB/sec 00:00:01 0 Errors
  6. //解压
  7. [root@Nginx ssl_key]# unzip 1524377920931.zip

配置nginx https

  1. [root@Nginx conf.d]# cat ssl.nginx.bjstack.com.conf
  2. server {
  3. listen 443;
  4. server_name nginx.bjstack.com;
  5. ssl on;
  6. ssl_session_timeout 10m;
  7. ssl_certificate ssl_key/1524377920931.pem;
  8. ssl_certificate_key ssl_key/1524377920931.key;
  9. ssl_ciphers
  10. ssl_protocols
  11. ssl_session_cache shared:SSL:10m; #在建立完ssl握手后如果断开连接,在session_timeout时间内再次连接,是不需要在次建立握手,可以复用之前的连接
  12. ssl_session_timeout 1440m; #ssl连接断开后的超时时间
  13. ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用的TLS版本协议
  14. ssl_prefer_server_ciphers on; #Nginx决定使用哪些协议与浏览器进行通讯
  15. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #配置加密套间
  16. location / {
  17. root /soft/code;
  18. index index.html index.htm;
  19. }
  20. }
  21. server {
  22. listen 80;
  23. server_name nginx.bjstack.com;
  24. return 302 https://$server_name$request_uri;
  25. }

测试访问Https
11.Nginx HTTPS 实践 - 图12
使用腾讯云ATS检测工具检查是否满足苹果IOS要求苹果ATS测试传送门
11.Nginx HTTPS 实践 - 图13

5.阿里云SLB负载实现HTTPS实践

11.Nginx HTTPS 实践 - 图14
1) 环境准备

角色 外网IP(NAT) 内网IP(LAN) 协议
slb eth0:10.0.0.5 eth1:172.16.1.5 https
ecs01 eth0:10.0.0.7 eth1:172.16.1.7 http
ecs02 eth0:10.0.0.8 eth1:172.16.1.8 http

6.Nginx4+7层负载实现HTTPS实战

配置1台nginx四层负载均衡,2台7层nginx负载,4台后端web节点实现全栈https

角色 弹性公网 内网网络 协议 端口
tcp_proxy 47.104.29.64 172.16.1.164 https/http 80/443
http_proxy01 172.16.1.165 http/https 80/443
http_proxy02 172.16.1.166 http/https 80/443
http_web01 172.16.1.167 http 80
http_web02 172.16.1.168 http 80
http_web03 172.16.1.169 http 80
http_web04 172.16.1.170 http 80

1.Nginx四层负载均衡配置如下

  1. [root@tcp_lb conf.c]# cat tcp_lb.bjstack.com.conf
  2. stream {
  3. upstream proxy_lb_bjstack {
  4. server 172.16.1.165:80;
  5. server 172.16.1.166:80;
  6. }
  7. upstream proxy_lb_bjstack_443 {
  8. server 172.16.1.165:443;
  9. server 172.16.1.166:443;
  10. }
  11. server {
  12. listen 80;
  13. proxy_pass proxy_lb_bjstack;
  14. }
  15. server {
  16. listen 443;
  17. proxy_pass proxy_lb_bjstack_443;
  18. }
  19. }

2.lb01与lb02配置七层负载均,具体内容如下

  1. [root@lb-node1 ~]# cat /etc/nginx/conf.d/proxy_lb.bjstack.com.conf
  2. upstream node {
  3. server 172.16.1.167:80;
  4. server 172.16.1.168:80;
  5. server 172.16.1.169:80;
  6. server 172.16.1.170:80;
  7. }
  8. server {
  9. listen 80;
  10. server_name lb.bjstack.com;
  11. location / {
  12. return 302 https://$server_name$request_uri;
  13. }
  14. }
  15. server {
  16. listen 443;
  17. server_name lb.bjstack.com;
  18. ssl on;
  19. ssl_certificate ssl_key/server.crt;
  20. ssl_certificate_key ssl_key/server.key;
  21. location / {
  22. proxy_pass http://node;
  23. proxy_set_header Host $http_host;
  24. proxy_set_header X-Real-IP $remote_addr;
  25. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  26. }
  27. }

3.后端多台web节点配置如下

  1. [root@web02 ~]# cat /etc/nginx/conf.d/web_lb.bjstack.com.conf
  2. server {
  3. listen 80;
  4. server_name lb.bjstack.com;
  5. location / {
  6. root /code;
  7. index index.html;
  8. }
  9. }