1.1 安全通信四大原则
安全的网络通信必须满足以下四个核心原则,这也是 HTTPS 的设计基石:
- 机密性:通过加密算法对数据进行加密处理,即使数据被中间人窃听,也无法获取明文内容,从根源上解决窃听风险。
- 完整性:通过摘要算法与数字签名验证数据完整性,确保数据在传输过程中未被篡改,哪怕修改一个标点符号,接收方也能立即识别并拒绝非法报文。
- 身份认证:通过数字证书确认通信双方的真实身份,解决冒充风险,避免用户访问钓鱼网站或被中间人劫持。
- 不可否认:通过数字签名技术,确保已发生的通信行为无法被抵赖,类似电子借条的法律效力,避免交易纠纷。
1.2 HTTPS 架构与发展
HTTPS 本质是HTTP + SSL/TLS,在 TCP 与 HTTP 之间增加了 SSL/TLS 加密层,实现应用层数据的加解密。自 2016 年起,国内互联网巨头开始大力推行 HTTPS,相关里程碑事件包括:
- Google 搜索引擎将 HTTPS 站点纳入搜索排名权重,安全站点获得更高曝光;
- 2017 年起,Chrome 浏览器将纯 HTTP 站点标记为 "不安全";
- 苹果 App Store、微信小程序强制要求使用 HTTPS 加密链接;
- HTTP/2 等新一代协议的支持,必须以 HTTPS 为基础。
二、Nginx 编译安装与基础安全配置
Nginx 是目前最主流的高性能 Web 服务器与反向代理软件,为了实现完整的安全功能,推荐采用编译安装方式,便于自定义模块与安全参数。
2.1 编译安装 Nginx
(1)安装依赖环境
Nginx 的编译需要依赖 pcre、zlib、OpenSSL 等开发库,执行以下命令安装:
bash
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)创建运行用户与日志目录
为了最小化权限风险,创建专用的 nginx 运行用户,避免使用 root 权限运行服务:
bash
useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
(3)编译与安装
下载 Nginx 源码包并编译,启用 SSL、HTTP/2 等核心安全模块:
bash
tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream
make && make install
(4)配置系统服务
创建 systemd 服务文件,实现 Nginx 的开机自启与进程管理:
bash
vi /lib/systemd/system/nginx.service
文件内容如下:
ini
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root
[Install]
WantedBy=multi-user.target
加载服务并启动:
bash
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx
2.2 核心安全加固配置
(1)隐藏版本号
生产环境中泄露 Nginx 版本号会被攻击者利用,针对性发起版本相关漏洞攻击,需隐藏版本信息:
bash
vi /usr/local/nginx/conf/nginx.conf
在http块中添加:
nginx
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; # 隐藏版本号
# ... 其他配置
}
验证配置:
bash
nginx -t
nginx -s reload
curl -I 192.168.10.101
此时响应头中Server字段将不再显示版本号,仅显示nginx。
(2)限制危险请求方法
HTTP 协议中存在多种高风险请求方法,如 TRACE(易引发 XST 攻击)、PUT/DELETE(文件篡改风险)、CONNECT(代理滥用),需通过配置白名单限制:
nginx
server {
# ... 其他配置
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444; # 非白名单方法直接关闭连接
}
}
验证测试:
bash
curl -XPUT -I 192.168.10.101
# 预期结果:Empty reply from server
# 查看日志:tail /usr/local/nginx/logs/access.log | grep 444
⚠️ 注意:TRACE 和 CONNECT 方法会被 Nginx 核心层直接拦截,不会进入 location 处理流程,因此状态码可能为 405 或 400,而非 444。
(3)CC 攻击防御(请求速率限制)
CC 攻击(Challenge Collapsar)通过大量伪造请求耗尽服务器资源,使用 Nginx 的limit_req模块可有效限制请求速率:
nginx
http {
# 定义限制区:10MB内存,每个IP每秒最多10次请求
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
# ... 其他配置
limit_req zone=req_limit burst=20 nodelay;
}
}
参数说明:
zone=req_limit:10m:创建名为req_limit的共享内存区,大小 10MB,用于存储客户端 IP 信息;rate=10r/s:限制每个 IP 每秒最多 10 次请求;burst=20:设置等候队列,超出速率的请求可排队等待;nodelay:立即处理等候队列中的请求,避免延迟。
压力测试验证:
bash
# 安装ab测试工具
dnf install httpd-tools -y
# 发起300次请求,并发30个
ab -n 300 -c 30 http://192.168.10.101/
# 查看日志,大量请求将返回503状态码
tail -300 /usr/local/nginx/logs/access.log | grep -c 503
(4)防盗链配置
盗链行为会消耗服务器带宽并侵犯版权,通过验证请求来源实现防盗链:
nginx
server {
location ~* \.(jpg|jpeg|png|gif|ico)$ {
valid_referers none blocked www.aaa.com;
if ($invalid_referer) {
return 403; # 非法来源直接拒绝
}
}
}
valid_referers:指定合法的请求来源域名;$invalid_referer:当请求来源不在白名单时,变量值为真,返回 403 拒绝访问。
三、HTTPS 证书生成与 Nginx 配置
HTTPS 的核心是 SSL/TLS 证书,分为CA 签名证书 (受浏览器信任)和自签名证书(用于测试 / 内部环境)。
3.1 生成自签名证书(测试环境)
使用 OpenSSL 生成自签名证书与私钥:
bash
# 创建证书存储目录
mkdir -p /etc/nginx/ssl
# 生成证书与私钥(有效期365天,2048位RSA密钥)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx-selfsigned.key \
-out /etc/nginx/ssl/nginx-selfsigned.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"
参数说明:
-x509:生成自签名证书(而非 CSR 请求);-nodes:不加密私钥,避免重启服务时输入密码;-days 365:证书有效期 1 年;-subj:指定证书主题信息,可按需修改。
3.2 Nginx 启用 HTTPS
修改 Nginx 配置文件,监听 443 端口并配置证书:
nginx
server {
listen 443 ssl; # 监听HTTPS端口
server_name localhost; # 域名或IP
# 指定证书与私钥路径
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
# SSL协议与加密套件配置(提升安全性)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# 网站根目录配置
location / {
root /usr/local/nginx/html;
index index.html;
}
}
# 可选:将HTTP请求重定向到HTTPS
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
验证并重载配置:
bash
nginx -t
nginx -s reload
此时访问https://192.168.10.101即可启用 HTTPS 加密传输(自签名证书会被浏览器提示不安全,生产环境需使用 CA 签名证书)。
四、高级防护:动态黑名单
动态黑名单是 Nginx 中实时拦截恶意请求的高效机制,可在不重启服务的情况下更新封禁 IP,适用于高并发攻击场景。
4.1 配置动态黑名单
(1)创建黑名单文件
bash
vi /usr/local/nginx/conf/blockips.conf
添加需要封禁的 IP 或网段:
plaintext
192.168.1.0/24 1; # 封禁整个网段
192.168.10.102 1; # 封禁单个IP
IP 后数字含义:
0:允许访问;1:返回 403 Forbidden;2:返回 444 关闭连接;3:返回 503 服务不可用。
(2)修改主配置文件
在http块中引入黑名单逻辑:
nginx
http {
geo $block_ip {
default 0; # 默认允许访问
include /usr/local/nginx/conf/blockips.conf;
}
server {
# ... 其他配置
if ($block_ip) {
return 403; # 触发封禁逻辑
}
}
}
geo:Nginx 内置模块,基于客户端 IP 生成变量值;$block_ip:自定义变量,存储 IP 封禁状态。
(3)自动封禁恶意 IP
编写 Shell 脚本,自动封禁访问次数超过阈值的 IP:
bash
#!/bin/bash
# 自动封禁访问超过100次的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr \
| awk '{if($1>100) print $2 " 1;"}' > /usr/local/nginx/conf/blockips.conf
将脚本加入定时任务,实现周期性自动封禁:
bash
crontab -e
# 每小时执行一次
0 * * * * /bin/bash /path/to/block_ips.sh
五、总结与生产环境建议
本文从 HTTPS 原理出发,完整覆盖了 Nginx 编译安装、基础安全加固、HTTPS 证书部署及高级防护方案,核心要点如下:
- 安全原则:始终围绕机密性、完整性、身份认证、不可否认四大原则设计 Web 服务;
- 最小权限:编译安装时创建专用运行用户,避免使用 root 权限;
- 风险前置:隐藏版本号、限制危险请求方法,从源头减少攻击面;
- 流量控制 :通过
limit_req模块防御 CC 攻击,保障服务可用性; - 加密传输:生产环境必须使用 CA 签名证书部署 HTTPS,避免自签名证书的安全风险;
- 动态防护:结合日志分析与动态黑名单,实现自动化恶意 IP 拦截。