首页 / 资讯中心 / 文章详情

Let‘s Encrypt免费HTTPS证书申请与Nginx配置指南

Let‘s Encrypt免费HTTPS证书申请与Nginx配置指南 ★ FEATURED ARTICLE
1. HTTPS证书与Lets Encrypt基础认知第一次接触网站安全部署时我被各种证书类型和加密协议搞得晕头转向。直到遇到Lets Encrypt这个非营利性证书颁发机构(CA)彻底改变了HTTPS普及的游戏规则。与传统CA不同它提供完全免费的自动化证书服务通过ACME协议实现了证书申请、验证、签发、续期的全流程自动化。为什么说这是革命性的过去一张最基础的DV证书年费至少也要几百元而企业级EV证书更是高达数千元。Lets Encrypt的出现直接让HTTPS部署成本归零根据最新统计全球已有超过3亿个网站使用其颁发的证书。其签发的证书被所有主流浏览器信任包括Chrome、Firefox、Safari等在兼容性方面完全不用担心。证书类型上Lets Encrypt提供的是Domain Validation (DV)证书适合个人网站、博客和小型企业站点。虽然不像OV或EV证书那样显示公司信息但对于基础加密需求已经完全足够。每张证书默认包含100个备用名称(SAN)可以覆盖主域名及其子域名有效期90天的设计则强制要求管理员建立自动化续期流程——这实际上提升了整体安全性。2. 环境准备与工具选型在开始实际操作前我们需要准备好基础环境。以Ubuntu 20.04 LTS为例系统需要预先安装Nginx/Apache等Web服务器本文以Nginx为例开放的80和443端口有效的域名解析A记录指向服务器IP证书获取工具方面官方推荐的Certbot是首选方案。这个Python开发的客户端工具几乎支持所有主流操作系统和Web服务器。安装非常简单sudo apt update sudo apt install certbot python3-certbot-nginx这里特别建议同时安装对应Web服务器的插件如python3-certbot-nginx这样后续可以自动完成证书部署和配置更新。如果使用其他Web服务器如Apache只需替换包名中的nginx为apache即可。对于无法安装Certbot的特殊环境如旧版系统还可以使用acme.sh这类纯Shell实现的替代方案。不过Certbot作为官方维护项目在功能完整性和文档支持上更有优势建议优先采用。3. 证书申请全流程实操3.1 基础单域名证书申请最基础的证书申请命令如下sudo certbot --nginx -d example.com这个命令会自动验证域名所有权通过80端口HTTP挑战生成ECDSA密钥对默认使用secp384r1椭圆曲线向Lets Encrypt提交证书签名请求(CSR)获取证书后自动配置Nginx的SSL参数整个过程通常能在20秒内完成。成功后你会看到类似这样的输出Congratulations! Your certificate for example.com has been obtained!证书文件默认存储在/etc/letsencrypt/live/example.com/目录下包含fullchain.pem证书链文件包含中间CAprivkey.pem私钥文件cert.pem仅包含站点证书chain.pem仅包含中间CA证书3.2 多域名与通配符证书对于需要覆盖多个域名的情况可以在命令中添加多个-d参数sudo certbot --nginx -d example.com -d www.example.com -d api.example.com更强大的通配符证书则需要使用DNS验证方式。以Cloudflare为例sudo certbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials ~/.cloudflare.ini \ -d *.example.com \ -d example.com需要提前准备Cloudflare API令牌并写入配置文件。其他DNS服务商也有对应插件如--dns-route53用于AWS Route53。重要提示通配符证书只匹配一级子域名即*.example.com可以覆盖a.example.com但不包括a.b.example.com4. Nginx SSL配置优化Certbot会自动帮我们生成基础SSL配置但生产环境还需要手动优化。以下是专业级配置建议ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 使用TLS 1.2/1.3并禁用不安全的协议和加密套件 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...; # 启用OCSP Stapling提升验证效率 ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid300s; # HSTS安全头谨慎启用 add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload;配置完成后建议使用SSL Labs测试工具(https://www.ssllabs.com/ssltest/)进行全方位安全评估目标达到A评级。5. 自动化续期与监控Lets Encrypt证书只有90天有效期自动化续期至关重要。Certbot默认会创建systemd定时任务sudo systemctl list-timers | grep certbot输出应该包含certbot.timer - Run certbot twice daily手动测试续期可以使用sudo certbot renew --dry-run对于关键业务系统建议添加监控检查证书过期时间。一个简单的Shell检查脚本#!/bin/bash DOMAINexample.com EXPIRY$(echo | openssl s_client -connect $DOMAIN:443 2/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d -f2) EXPIRY_EPOCH$(date -d $EXPIRY %s) NOW_EPOCH$(date %s) DAYS_LEFT$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 )) if [ $DAYS_LEFT -lt 10 ]; then echo 警报$DOMAIN 证书将在$DAYS_LEFT天后过期 fi6. 疑难问题排查指南6.1 常见错误与解决方案错误1Too many certificates already issued原因Lets Encrypt对每个域名有每周50张证书的限制解决合并多个子域名到一张证书中或等待限额重置错误2Failed to connect to host for DVSNI challenge原因服务器80/443端口未开放或被防火墙拦截解决检查安全组规则和本地防火墙(iptables/ufw)错误3Certificate is not due for renewal原因证书距离过期还有超过30天解决添加--force-renewal参数强制更新6.2 证书吊销流程如果私钥泄露应立即吊销证书sudo certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem吊销后需要立即申请新证书替换。注意已吊销的证书会被加入CRL列表浏览器会显示警告信息。7. 高级应用场景7.1 多服务器负载均衡配置在LB多Web服务器的架构中推荐以下部署方案选择一台服务器作为证书管理节点在此节点上正常申请证书使用rsync同步/etc/letsencrypt目录到其他服务器在所有节点设置相同的续期脚本同步脚本示例#!/bin/bash for server in web1 web2 web3; do rsync -azP --delete /etc/letsencrypt/ $server:/etc/letsencrypt/ ssh $server systemctl reload nginx done7.2 证书格式转换某些场景可能需要不同格式的证书比如Java应用通常需要PKCS12格式Windows IIS需要PFX格式移动端有时需要DER格式转换示例生成PKCS12格式openssl pkcs12 -export \ -in /etc/letsencrypt/live/example.com/fullchain.pem \ -inkey /etc/letsencrypt/live/example.com/privkey.pem \ -out example.com.p128. 安全最佳实践私钥保护设置600权限chmod 600 /etc/letsencrypt/live/example.com/privkey.pem禁止日志记录在Nginx配置中添加ssl_early_data off;防止密钥通过日志泄露密钥轮换 每30天执行强制更新并生成新密钥sudo certbot renew --force-renewal --key-type ecdsa --elliptic-curve secp384r1证书透明度监控 在https://crt.sh/订阅域名通知及时发异常证书签发备份策略 定期备份整个/etc/letsencrypt目录但确保privkey.pem加密存储9. 性能优化技巧启用TLS 1.3 相比TLS 1.21.3的握手速度提升明显延迟降低40%以上OCSP Stapling配置 减少客户端验证时的额外请求配置参考ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid300s;Session缓存优化ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_buffer_size 4k;早期数据(Early Data) 对于API服务可考虑启用但要注意重放攻击风险ssl_early_data on;10. 替代方案比较虽然Lets Encrypt是首选但在某些场景下可能需要考虑其他方案商业证书优势支持OV/EV验证、更长的有效期、保险保障代表DigiCert、Sectigo、GlobalSign私有PKI适用场景内网服务、大量临时域名工具OpenSSL、Smallstep、HashiCorp Vault其他免费CAZeroSSL提供网页控制台Buypass6个月有效期不过对于绝大多数公开Web服务Lets Encrypt仍然是性价比最高的选择。我在生产环境中运行着200个域名全部基于其证书体系通过完善的自动化流程SSL相关运维工作几乎为零。
阅读完成 · 觉得有帮助?
咨询建站