12、Nginx-HTTPS安全web服务

版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin

1.https基本概述

1.为什么需要使用HTTPS?

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

2.什么是https?

https安全的超文本传输协议,我们现在大部分站点都是通过https来实现站点数据安全。早期互联网公司设计了SSL安全套阶层协议,主要用于对http协议传输的数据进行加密。那如何将站点变成安全的https站点呢?我们需要了解ssl协议。
而现在很多时候我们在使用TLS传输层安全协议。

3.那么TLS是怎么保证明文消息被加密的呢?

在OSI七层模型中,应用层是http 协议,那么在应用层协议之下,我们的表示层,是ssl协议所发挥作用的一 层,它通过(握手、交换秘钥、告警、加密)等方式,使应用层http协议没 有感知的情况下做到了数据的安全加密。

4.证书权威生成机构

那么在数据进行加密与解密过程中,如何确定双方的身份,此时就需要有 一个权威机构来验证双方省份。那么这个权威机构则是CA机构。那CA机构 又是如何颁发证书

5.https通讯过程
如图所示

6.https证书类型

DV证书 个人使用,免费
OV证书 中小企业使用(大部分)
EV证书 (巨行企业使用)
单域名 www
多域名 www images cdn test m
通配符域名 *.kirin7.com 兼容 bbs.kirin7.com anc.kirin7.com
Https不支持续费,证书到期需重新申请新并进行替换.
Https不支持三级域名解析,如test.m.oldboy.com m.oldboy.com abc.oldboy.com a.b.c.abc.oldboy.com
Https显示绿色,说明整个网站的url都是https的,并且都是安全的。
Https显示黄色,说明网站代码中有部分URL地址是http不安全协议的。
Https显示红色,要么证书是假的,要么证书已经过期。

2.nginx单台实现https

1.环境准备
#nginx必须有ssl模块

[root@Nginx ~]# nginx -V
 
--with-http_ssl_module
#创建存放ssl证书的路径
[root@Nginx ~]# mkdir -p /etc/nginx/ssl_key

[root@Nginx ~]# cd /etc/nginx/ssl_key
2.使用openssl命令充当CA权威机构创建证书(生产不使用此方式生成证书)
[root@Nginx 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:
3.生成自签证书,同时去掉私钥的密码
[root@Nginx ssl_key]# openssl req -days 36500 -x509 \ 
-sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
###因为是黑户所以下面随便输入即可
4.证书申请完成后需要了解Nginx如何配置Https
#ssl启动模块

| Syntax: | **ssl** on | off; |
| :------- | ------------------- |
| Default: | ssl off; |
| Context: | http, server |

#证书文件模块
Syntax: **ssl_certificate** *file*;
Default:
Context: http, server
#密钥文件模块
Syntax: **ssl_certificate_key** *file*;
Default:
Context: http, server
5.配置Nginx配置Https实例
#nginx配置
[root@Nginx ~]# cat /etc/nginx/conf.d/ssl.conf
server {
	listen 443 ssl;  ###开启ssl功能
	server_name ssl.kirin7.com;
	ssl_certificate   ssl_key/server.crt;###ssl证书路径
	ssl_certificate_key ssl_key/server.key;###ssl秘钥路径
location / {
root /code/ssl;
index index.html;
	}
}
#准备对应的站点目录, 并重启Nginx服务
[root@Nginx ~]# mkdir -p /code
[root@Nginx ~]# echo "Https" > /code/index.html
[root@Nginx ~]# systemctl restart nginx
##浏览器输入 https://ssl.com 访问, 由于该证书非第三方权威机构颁发,而是我们自己签发的,所以浏览器会警告
6.用户忘记在浏览器地址栏输入 https:// 怎么办
#建议配置将用户访问 http请求强制跳转https
[root@Nginx ~]# cat /etc/nginx/conf.d/ssl.conf
server {
	listen 443 ssl;  ###开启ssl功能
	server_name ssl.kirin7.com;
	ssl_certificate   ssl_key/server.crt;###ssl证书路径
	ssl_certificate_key ssl_key/server.key;###ssl秘钥路径
location / {
root /code/ssl;
index index.html;
	}
}
server {
	listen 80;
server_name s.oldboy.com;
rewrite ^(.*)$ https://$server_name$1 redirect;
##基于rewrite跳转
 #return 302 https://$server_name$request_uri;
##基于return跳转
}

3.Nginx集群实现HTTPS

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端口
#web01 web02相同配置
[root@web01 conf.d]# cat blog.kirin7.com.conf
server {
	listen 80;
	server_name blog.kirin7.com;
	root /code/wordpress;
	index index.php index.html;
	location ~ \.php$ {
	root /code/wordpress;
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	fastcgi_param HTTPS on;###开启支持https
	include   fastcgi_params;
	index index.html;
	}
}
Nginx负载均衡先生成证书
#Nginx负载均衡配置文件如下
[root@lb01 ~]# 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 ssl;
	server_name blog.kirin7.com;
	ssl_certificate ssl_key/server.crt;
	ssl_certificate_key ssl_key/server.key;
	location / {
		proxy_pass http://site;
		include proxy_params;
	}
}
# 用户http请求跳转至https
server {
	listen 80;
	server_name blog.kirin7.com;
return 302 https://$server_name$request_uri;
}

4.https优化

设置 worker_processes 等于 cpu核心总数 lscpu
开启 keepalived长连接 keepalive_timeout 设置长一些 70 keepalive_timeout 70;
enable the shared session cache, 开启内存中的共享空间,存 放session缓存
disable the built-in session cache 关闭内置session缓存
增加session过期时间
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定tls版本
ssl_ciphers AES128-SHA:AES256-SHA:RC4- SHA:DES-CBC3-SHA:RC4-MD5; #指定可以用加密格式
posted @ 2022-07-06 10:21  kirin(麒麟)  阅读(153)  评论(0编辑  收藏  举报
Δ