为什么需要 HTTPS
HTTPS 通过 TLS 加密客户端与服务器之间的通信,防止数据被窃听或篡改。现代浏览器对未启用 HTTPS 的站点会显示"不安全"警告,影响用户信任与转化。本文介绍在 DMIT 云服务器上为 Nginx 配置免费 Let's Encrypt 证书的方法。
前置条件
- 已解析域名 A 记录(或 AAAA 记录)到服务器 IP
- 已安装 Nginx 并能正常访问 80 端口
- 服务器防火墙已放行 80 与 443 端口
- 能通过 SSH 登录服务器(参考《SSH 安全加固》)
安装 Certbot
# Debian/Ubuntu
apt update
apt install certbot python3-certbot-nginx -y
# 验证安装
certbot --version
申请证书并自动配置 Nginx
Certbot 的 Nginx 插件可自动修改站点配置并启用 HTTPS:
certbot --nginx -d example.com -d www.example.com
按提示输入邮箱、同意条款后,Certbot 会自动完成以下操作:申请证书、修改 Nginx 配置、配置 80→443 重定向、设置自动续期。
手动指定 Webroot(可选)
certbot certonly --webroot -w /var/www/html -d example.com
验证自动续期
Let's Encrypt 证书有效期为 90 天,Certbot 通过 systemd timer 自动续期。手动测试续期逻辑:
certbot renew --dry-run
如果输出包含 "Congratulations" 表示续期配置正确。实际续期由系统定时器静默完成,无需人工干预。
Nginx TLS 配置建议
证书申请后,建议优化 Nginx 的 TLS 配置以兼顾安全与性能:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000" always;
开启 HSTS 后浏览器会强制使用 HTTPS,但需确保证书长期有效,否则会导致无法访问。
多域名与通配符证书
单个证书可包含多个域名(SAN)。通配符证书需用 DNS 验证:
certbot certonly --manual --preferred-challenges=dns -d "*.example.com"
按提示在域名 DNS 中添加 TXT 记录完成验证。DNS 验证无法自动续期,建议配合 DNS API 插件使用。
证书文件位置
/etc/letsencrypt/live/example.com/
├── fullchain.pem # 证书链
├── privkey.pem # 私钥
├── cert.pem # 证书
└── chain.pem # 中间证书
常见问题
证书续期失败?
# 检查 80 端口是否被占用
ss -tlnp | grep :80
# 检查 DNS 解析是否正确
dig +short example.com
混合内容警告?
页面中若有 http:// 资源会触发混合内容警告。将内部链接改为相对路径或 https://,并在 Nginx 中添加:
add_header Content-Security-Policy "upgrade-insecure-requests";
性能影响?
TLS 握手有少量开销,但现代 CPU 与 TLS 1.3 的 0-RTT 可大幅降低延迟。更多性能优化见《性能调优指南》。
相关文章
《初次部署检查清单》、《Docker 部署指南》、《故障排查指南》。
本文核对日期:2026-08-18。Certbot 命令以官方文档为准。