从 Let's Encrypt 证书生成到高级 HTTPS 配置

Nginx SSL/TLS 配置教程:从 Let's Encrypt 证书生成到高级 HTTPS 配置

以下是一份完整的 Nginx SSL/TLS 配置指南,涵盖证书生成、基础配置、优化技巧和实战场景示例。


一、生成 Let's Encrypt 证书(Certbot)

1. 安装 Certbot

bash 复制代码
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx

# CentOS/RHEL
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx

2. 生成证书

单域名证书(自动配置Nginx)

bash 复制代码
sudo certbot --nginx -d example.com

多域名证书

bash 复制代码
sudo certbot --nginx -d example.com -d www.example.com

泛域名证书(需DNS验证)

bash 复制代码
sudo certbot certonly --manual --preferred-challenges=dns -d *.example.com

Webroot模式(Nginx运行时)

bash 复制代码
sudo certbot certonly --webroot -w /var/www/html -d example.com

3. 自动续期

bash 复制代码
# 测试续期
sudo certbot renew --dry-run

# 添加定时任务(每月续期)
sudo crontab -e
# 添加行:
0 3 * * * /usr/bin/certbot renew --quiet

二、Nginx HTTPS 基础配置

1. 基本 SSL 配置模板

nginx 复制代码
server {
    listen 443 ssl http2;
    server_name example.com;

    # 证书路径
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 协议配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    # 密码套件
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';

    # 会话缓存
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # 其他安全头
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;

    # 网站根目录
    root /var/www/html;
    index index.html;
}

三、场景化配置示例

1. 单域名配置

nginx 复制代码
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;
    # ... SSL配置同上 ...
}

2. 多域名配置

nginx 复制代码
# 主域名
server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /path/to/example.com/fullchain.pem;
    ssl_certificate_key /path/to/example.com/privkey.pem;
    # ...
}

# 子域名
server {
    listen 443 ssl http2;
    server_name blog.example.com;
    ssl_certificate /path/to/blog.example.com/fullchain.pem;
    ssl_certificate_key /path/to/blog.example.com/privkey.pem;
    # ...
}

3. 泛域名配置

nginx 复制代码
server {
    listen 443 ssl http2;
    server_name *.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # ...
}

四、高级优化配置

1. OCSP Stapling(提升SSL握手速度)

nginx 复制代码
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;

2. 会话恢复(减少TLS握手)

nginx 复制代码
ssl_session_tickets on;
ssl_session_timeout 1d;

3. 安全增强配置

nginx 复制代码
# 禁用弱加密算法
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_ecdh_curve secp384r1;

# 启用TLS 1.3 0-RTT(谨慎使用)
ssl_early_data on;

五、安全检测与调试

1. 测试命令

bash 复制代码
# 检查配置语法
sudo nginx -t

# SSL检测(Qualys SSL Labs)
openssl s_client -connect example.com:443 -servername example.com -tlsextdebug 2>&1 | grep -i "certificate\|protocol"

2. 日志分析

nginx 复制代码
error_log /var/log/nginx/ssl_error.log debug;

六、常见问题处理

1. 证书续期失败

  • 检查Nginx配置是否占用80/443端口
  • 验证DNS解析是否正确
  • 确保.well-known目录可访问

2. 混合内容问题

  • 使用浏览器开发者工具检查Mixed Content警告
  • 将所有HTTP资源替换为HTTPS

3. 配置错误排查

bash 复制代码
# 查看SSL握手详情
openssl s_client -connect example.com:443 -status

建议定期使用 SSL Labs Test 检测服务器安全性。

相关推荐
音视频牛哥6 小时前
nginx-rtmp-module之ngx_rtmp_live_module.c代码详解
运维·c语言·nginx·ffmpeg·大牛直播sdk·nginx rtmp代码·nginx rtmp服务器
若云止水9 小时前
ngx_http_core_location
nginx
抓哇小菜鸡15 小时前
nginx
运维·nginx·dubbo
qq_4136913519 小时前
CI/CD(六) helm部署ingress-nginx(阿里云)
nginx·阿里云·ci/cd·helm·ingress-nginx
音视频牛哥21 小时前
Nginx RTMP 服务器开发设计与实现
运维·服务器·nginx·大牛直播sdk·nginx rtmp代码·nginx rtmp·nginx流媒体服务器
鲁子狄21 小时前
[笔记] CentOS7 + Nginx 环境下,安装使用 Let‘s Encrypt 免费 SSL 证书 (自动续签)
后端·网络协议·nginx
繁华落尽,寻一世真情1 天前
【Flask公网部署】采用Nginx+gunicorn解决Flask框架静态资源无法加载的问题
nginx·flask·gunicorn
大橘1 天前
centos8上实现lvs集群负载均衡nat模式
linux·nginx·负载均衡·lvs
mqiqe1 天前
nginx 仔细构建 HTTP 头,避免使用未验证/未清理的输入数据
运维·nginx·http
怒放de生命20102 天前
【干货,实战经验】nginx缓存问题
运维·nginx·缓存