HTTPS 证书配置完全指南:从申请到自动化续期
前言为什么需要 HTTPS在当今互联网环境下HTTPS 已经不是可选项而是必选项。浏览器会将 HTTP 网站标记为“不安全”影响用户信任搜索引擎也会给予 HTTPS 网站更高的排名权重。更重要的是HTTPS 能保护用户数据不被窃听、篡改防止中间人攻击。本文将全面介绍 HTTPS 证书的配置方案涵盖从证书申请、部署到自动化续期的完整流程。一、HTTPS 证书类型选择在开始配置之前首先需要了解不同类型的证书及其适用场景。证书类型验证级别适用场景典型获取成本DV域名验证仅验证域名所有权个人博客、测试环境免费如 Lets EncryptOV组织验证验证企业身份企业官网、商业网站几百元/年EV扩展验证严格法律验证银行、支付、大型电商上千元/年通配符证书覆盖 *.domain.com多子域名场景数百至数千元推荐方案个人/小型项目Lets Encrypt 免费 DV 证书 自动化续期企业官网OV 证书建立用户信任多子域名场景通配符证书单证书覆盖所有子域二、免费方案Lets Encrypt CertbotLets Encrypt 是目前最主流的免费证书颁发机构由 Linux 基金会、Google、Mozilla 等共同支持证书有效期 90 天支持自动化续期。2.1 环境准备bash# Ubuntu/Debian 系统 sudo apt update sudo apt install certbot python3-certbot-nginx # Nginx 版本 # 或 sudo apt install certbot python3-certbot-apache # Apache 版本 # CentOS/RHEL sudo dnf install certbot python3-certbot-nginx # macOS brew install certbot2.2 获取证书方式一自动配置推荐适用于标准配置bash# Nginx 自动配置 sudo certbot --nginx -d example.com -d www.example.com # Apache 自动配置 sudo certbot --apache -d example.com -d www.example.comCertbot 会自动验证域名所有权获取证书自动修改 Web 服务器配置启用 HTTPS配置自动续期 cronjob方式二手动获取证书适用于非标准环境bash# 仅获取证书不自动配置 sudo certbot certonly --standalone -d example.com -d www.example.com证书将保存在/etc/letsencrypt/live/example.com/fullchain.pem证书链/etc/letsencrypt/live/example.com/privkey.pem私钥2.3 手动配置 Web 服务器Nginx 配置示例nginxserver { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com www.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_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; # HSTS - 强制浏览器使用 HTTPS add_header Strict-Transport-Security max-age63072000 always; # 其他安全头 add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; root /var/www/html; index index.html; } # HTTP 重定向到 HTTPS server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; }Apache 配置示例apacheVirtualHost *:443 ServerName example.com ServerAlias www.example.com SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem # 安全配置 SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256 SSLCompression off DocumentRoot /var/www/html /VirtualHost VirtualHost *:80 ServerName example.com Redirect permanent / https://example.com/ /VirtualHost2.4 自动化续期Lets Encrypt 证书有效期 90 天必须自动续期。Certbot 安装时会自动添加 cronjobbash# 测试续期是否正常 sudo certbot renew --dry-run # 手动执行续期 sudo certbot renew # 查看续期定时任务 systemctl list-timers | grep certbot # 或 crontab -l默认续期脚本位置/etc/cron.d/certbot/etc/systemd/system/certbot.timer三、商业证书部署方案对于企业场景通常会购买商业证书如 DigiCert、Sectigo、GlobalSign。商业证书有效期通常为 1-2 年验证流程更严格。3.1 获取商业证书后的文件一般会提供以下几个文件server.crt- 服务器证书intermediate.crt- 中间证书ca_bundle.crt- 根证书链server.key- 私钥自己生成并保管3.2 合并证书链很多 Web 服务器需要完整的证书链文件bash# 合并服务器证书和中间证书 cat server.crt intermediate.crt ca_bundle.crt fullchain.pem # 确保私钥权限安全 chmod 600 server.key chmod 644 fullchain.pem3.3 Nginx 配置商业证书nginxserver { listen 443 ssl http2; server_name example.com; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/server.key; # 其余配置同免费方案 }四、高级配置方案4.1 通配符证书配置通配符证书允许一个证书覆盖主域名及其所有一级子域名例如*.example.com可覆盖www.example.com、api.example.com、blog.example.com。通过 DNS 验证获取通配符证书Lets Encryptbash# 使用 DNS 验证模式 sudo certbot certonly --manual --preferred-challenges dns -d *.example.com -d example.com脚本会提示添加一条 TXT 记录到 DNS。验证通过后即可获取通配符证书。手动配置通配符证书时无需特殊配置Nginx 中正常配置即可nginxserver { server_name ~^(?sub.)\.example\.com$; # 或使用通配符 server_name *.example.com; }4.2 CDN 场景下的证书配置当网站使用 CDNCloudFlare、阿里云 CDN、CloudFront 等时需要考虑信任链问题方案一源站自签名证书 CDN 边缘证书CDN 边缘使用正式证书源站到 CDN 之间使用自签名证书方案二源站部署正式证书更安全推荐使用Lets Encrypt 证书即可CloudFlare 特别方案CloudFlare 提供 15 年有效期的源站证书可在 CDN 后台生成并安装到源站nginx# CloudFlare 源站证书配置 ssl_certificate /etc/nginx/ssl/origin-pull.pem; ssl_certificate_key /etc/nginx/ssl/origin-pull.key; # 限制仅允许 CloudFlare IP 访问源站可选 allow 173.245.48.0/20; allow 103.21.244.0/22; # ... 添加所有 CloudFlare IP 段 deny all;4.3 内部网络证书自签名 CA内网环境可以使用自签名 CA 签发证书避免浏览器警告需将 CA 证书导入客户端。bash# 生成 CA 私钥 openssl genrsa -out ca.key 4096 # 生成 CA 证书有效期 10 年 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt # 为内网域名生成证书签名请求 openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr # 使用 CA 签发证书 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ -CAcreateserial -out server.crt -days 365 -sha256五、安全配置最佳实践5.1 SSL/TLS 安全基准配置nginx# 推荐的安全配置Nginx ssl_protocols TLSv1.2 TLSv1.3; # 禁用 TLS 1.0/1.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 off; # 允许客户端选择更优密码套件TLSv1.3 要求 ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # OCSP Stapling提升握手速度 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;5.2 使用 SSL Labs 测试配置完成后务必使用 SSL Labs 进行 A 评级测试bash# 也可使用命令行工具快速检查 openssl s_client -connect example.com:443 -tls1_25.3 定期检查证书过期bash# 检查证书过期时间 echo | openssl s_client -servername example.com -connect example.com:443 2/dev/null | openssl x509 -noout -dates # 设置监控告警通过监控系统 # Prometheus blackbox_exporter 可配置证书过期告警六、常见问题与故障排查Q1证书申请失败“Challenge failed for domain”可能原因及解决DNS 解析延迟使用 DNS 验证时等待几分钟再试HTTP 验证时端口 80 被占用--standalone模式需要 80/443 端口防火墙阻挡确保 80/443 端口可访问Q2浏览器提示“不完整的证书链”解决方法bash# 检查证书链是否完整 openssl s_client -connect example.com:443 -showcerts # 确保 Nginx 配置包含 fullchain.pem含中间证书 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;Q3移动端或旧系统无法访问需要支持旧设备时可降级 TLS 版本不推荐nginx# 兼容 Android 4.x / iOS 8 以下 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 但建议如果是公开服务不要这样做Q4重定向循环问题检查是否有多个重定向配置例如Nginx 配置了 HTTP→HTTPS 重定向应用框架WordPress、Django也配置了强制 HTTPS解决只在一处配置重定向。七、总结与方案选型建议场景推荐方案成本运维复杂度个人博客/静态站Lets Encrypt Nginx免费低完全自动公司官网OV 商业证书中等低年付多服务/K8s 环境cert-manager Lets Encrypt免费中需 K8s 知识内网环境自签名 CA免费中需分发 CACDN 源站CloudFlare 源站证书免费低金融/支付类EV 证书高低最后的建议优先使用 Lets Encrypt 自动化续期免费且安全足够任何时候都不要禁用安全配置以“兼容”老旧系统启用 HSTS但注意一旦启用后续切换回 HTTP 的用户会有困难建议配置证书过期监控避免证书过期导致服务中断*本指南配置示例基于 Nginx 1.20 / Certbot 2.0 / Lets Encrypt 最新规范发布于 2025 年。如有更新请以官方文档为准。*