HTTPS 部署(核心配置)
HTTP 强制跳转 HTTPS
|---------------------------------------------------------------------------------------------------------------------------|
| nginx server { listen 80; server_name 你的域名; # 替换为实际域名(如example.com) return 301 https://hostrequest_uri; # 永久跳转,保留请求路径 } |
HTTPS 安全配置(可直接上生产)
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| nginx server { listen 443 ssl http2; # 开启SSL和HTTP/2,提升性能 server_name 你的域名; # 证书路径(替换为自身证书实际路径) ssl_certificate /etc/nginx/ssl/fullchain.pem; # 完整证书链 ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 私钥文件 # 安全协议与加密套件(仅启用高安全协议,禁用不安全套件) ssl_protocols TLSv1.2 TLSv1.3; # 禁用TLSv1.0、TLSv1.1 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; # 优先使用服务器指定的加密套件 # 会话优化(减少SSL握手开销,提升访问速度) ssl_session_cache shared:SSL:10m; # 共享会话缓存,大小10M ssl_session_timeout 1d; # 会话超时时间1天 # HSTS 强制HTTPS(防止降级攻击,浏览器自动跳转HTTPS) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 有效期1年,包含子域名 # 安全响应头(防御XSS、点击劫持等攻击) add_header X-Frame-Options DENY; # 禁止嵌入iframe,防点击劫持 add_header X-Content-Type-Options nosniff; # 禁止浏览器猜测文件类型 add_header X-XSS-Protection "1; mode=block"; # 开启XSS防护,发现攻击直接阻断 # 网站根目录与默认首页(替换为自身业务路径) root /var/www/html; index index.html; } |
Nginx 安全防护
隐藏 Nginx 版本号
|---------------------------------------------------------|
| nginx http { server_tokens off; # 关闭版本号显示,避免攻击者利用版本漏洞 } |
禁止访问隐藏文件
|----------------------------------------------------------------------------------------------------------------------|
| nginx location ~ /\. { # 匹配所有以.开头的隐藏文件(如.git、.env、.htaccess) deny all; # 禁止所有访问 access_log off; # 不记录访问日志,减少日志冗余 } |
上传目录禁止执行脚本
|----------------------------------------------------------------------------------------------------------------|
| nginx location /upload/ { # 匹配上传目录(替换为自身上传目录路径) location ~ \.php$ { deny all; } # 禁止在上传目录执行PHP脚本,可扩展其他脚本后缀 } |
防CC攻击------请求频率限制
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| nginx # 1. http块内定义请求限制规则 limit_req_zone binary_remote_addr zone=one:10m rate=10r/s; # binary_remote_addr:以客户端IP为标识;zone=one:10m:缓存区大小10M;rate=10r/s:每秒最多10个请求 # 2. server块内调用规则 limit_req zone=one burst=20 nodelay; # burst=20:允许突发20个请求;nodelay:突发请求不延迟,直接处理(避免队列等待) |
屏蔽恶意UA、扫描工具
|--------------------------------------------------------------------------------------------------------------------------------|
| nginx if ($http_user_agent ~* (sqlmap|nikto|python|scrapy|java|wget)) { # 匹配常见恶意UA(可根据实际情况增减) return 403; # 返回403禁止访问 } |
屏蔽敏感路径
|-------------------------------------------------------------------------------------------------------------|
| nginx location ~* (phpinfo|info\.php|test\.php) { # 匹配phpinfo、测试脚本等敏感路径(可根据业务补充) return 403; # 禁止访问 } |
SSL 证书检查脚本
脚本代码(check_ssl.sh)
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash # 检查是否传入域名参数 if [ # -ne 1 \];then echo "用法: 0 域名" # 提示正确用法 exit 1 # 退出脚本 fi domain=1 # 接收传入的域名参数 # 输出证书起止时间 echo "===== domain SSL 证书信息 =====" echo | openssl s_client -servername domain -connect domain:443 2>/dev/null | openssl x509 -noout -dates # 计算证书剩余有效天数 not_after=(echo \| openssl s_client -servername domain -connect domain:443 2\>/dev/null \| openssl x509 -noout -enddate \| cut -d= -f2) expire=(date -d "not_after" +%s) # 转换过期时间为时间戳 now=(date +%s) # 获取当前时间戳 left=(( (expire - now) / 86400 )) # 计算剩余天数(86400秒=1天) echo "证书剩余有效天数:left 天" # 输出剩余天数 |
脚本使用方法
|---------------------------------------------------------------------------------------------------------|
| bash chmod +x check_ssl.sh # 赋予脚本执行权限 ./check_ssl.sh 你的域名 # 执行脚本,替换为实际域名(如./check_ssl.sh www.baidu.com) |
部署与验证
- 检查Nginx配置是否正确(避免配置错误导致服务无法启动)
nginx -t
- 重启Nginx服务(使配置生效)
systemctl restart nginx
- SSL安全评级测试(验证HTTPS安全等级,目标A+)
访问链接:https://www.ssllabs.com/ssltest/,输入域名即可测试