1. Nginx的安全控制

  关于 Web 服务器的安全是比较大的一个话题,里面所涉及的内容很多,Nginx 反向代理是如何来提升 Web 服务器的安全呢?这里就要说一下安全隔离的概念了。
  通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问,这就是安全隔离。

1.1 如何使用SSL对流量进行加密

  通俗来说就是将我们常用的 http 请求转变成 https 请求,那么这两个之间的区别简单的来说两个都是 http 协议,只不过 https 是身披 SSL 外壳的 http。
  https 是一种通过计算机网络进行安全通信的传输协议。它经由 http 进行通信,利用 SSL/TLS 建立全通信,加密数据包,确保数据的安全性。

  • SSL(Secure Sockets Layer):安全套接层;
  • TLS(Transport Layer Security):传输层安全;

  上述这两个是为网络通信提供安全及数据完整性的一种安全协议,TLS 和 SSL 在传输层和应用层对网络连接进行加密。
  总结来说为什么要使用 https:

http协议是明文传输数据,存在安全问题,而https是加密传输,相当于http+ssl,并且可以防止流量劫持。

  Nginx 要想使用 SSL,需要满足一个条件即需要添加一个模块--with-http_ssl_module,而该模块在编译的过程中需要 OpenSSL 的支持。

1.2 Nginx添加SSL的支持

  完成--with-http_ssl_module模块的增量添加:

  1. 将原有/usr/local/nginx/sbin/nginx进行备份;
  2. 拷贝 Nginx 之前的配置信息;
  3. 在 Nginx 的安装源码进行配置指定对应模块./configure --with-http_ssl_module
  4. 通过make模板进行编译;
  5. objs下面的nginx移动到/usr/local/nginx/sbin下;
  6. 在源码目录下执行make upgrade进行升级,这个可以实现不停机添加新模块的功能。

1.3 Nginx的SSL相关指令

ssl:该指令用来在指定的服务器开启HTTPS,可以使用 listen 443 ssl,后面这种方式更通用些。

语法 ssl on | off;
默认值 ssl off;
位置 http、server
1
2
3
server{
listen 443 ssl;
}

ssl_certificate:为当前这个虚拟主机指定一个带有PEM格式证书的证书。

语法 ssl_certificate file;
默认值 -
位置 http、server

ssl_certificate_key:该指令用来指定PEM secret key文件的路径。

语法 ssl_ceritificate_key file;
默认值 -
位置 http、server

ssl_session_cache:该指令用来配置用于SSL会话的缓存。

语法 ssl_sesion_cache off|none|[builtin[:size]] [shared:name:size]
默认值 ssl_session_cache none;
位置 http、server
  • off:禁用会话缓存,客户端不得重复使用会话;
  • none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数;
  • builtin:内置 OpenSSL 缓存,仅在一个工作进程中使用;
  • shared:所有工作进程之间共享缓存,缓存的相关信息用 name 和 size 来指定;

ssl_session_timeout:开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。

语法 ssl_session_timeout time;
默认值 ssl_session_timeout 5m;
位置 http、server

ssl_ciphers:指出允许的密码,密码指定为OpenSSL支持的格式。

语法 ssl_ciphers ciphers;
默认值 ssl_ciphers HIGH:!aNULL:!MD5;
位置 http、server

ssl_prefer_server_ciphers:该指令指定是否服务器密码优先客户端密码。

语法 ssl_perfer_server_ciphers on|off;
默认值 ssl_perfer_server_ciphers off;
位置 http、server

1.4 生成证书

  • 方式一:使用阿里云/腾讯云等第三方服务进行购买(阿里云购买链接);
  • 方式二:使用 openssl 生成证书;

  使用openssl version命令确定当前系统是否安装 openssl。
  按照下面的步骤进行生成:

1
2
3
4
5
6
7
mkdir /root/cert
cd /root/cert
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

1.5 开启SSL实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
# 服务器端口使用443,开启ssl
listen 443 ssl;
# 域名,多个以空格分开
server_name localhost;

# ssl证书地址
ssl_certificate server.cert;
ssl_certificate_key server.key; # key文件的路径

# ssl验证相关配置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m; # 缓存有效期

ssl_ciphers HIGH:!aNULL:!MD5; # 加密算法
ssl_prefer_server_ciphers on; # 使用服务器端的首选算法

location / {
root html;
index index.html index.htm;
}
}

  将 http 重定向 https:

1
2
3
4
5
server {
listen 80;
server_name your-domain.com; # 你的域名
rewrite ^(.*)$ https://your-domain.com$1; # 把http的域名请求转成https
}

参考文献

  【1】https://www.bilibili.com/video/BV1ov41187bq?p=91&vd_source=e66fcf471e44c7ac45f918fd1f1e7a77
  【2】https://blog.csdn.net/weixin_44060108/article/details/121245182
  【3】https://blog.csdn.net/weixin_38615720/article/details/92827012?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-92827012-blog-123139998.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-92827012-blog-123139998.pc_relevant_antiscanv2&utm_relevant_index=2