Nginx 配置 HTTPS 实战:Let‘s Encrypt 免费证书 + HTTP/2 开启指南

Nginx 配置 HTTPS 实战:Let‘s Encrypt 免费证书 + HTTP/2 开启指南

在当今互联网环境中,网站安全性已成为不可忽视的重要指标。HTTPS不仅能够保护用户数据免受中间人攻击,还能提升搜索引擎排名和用户信任度。本文将手把手带您完成从零开始配置Nginx服务器HTTPS的全过程,包括免费SSL证书的获取、Nginx配置优化以及HTTP/2协议的启用。

1. 准备工作与环境检查

在开始配置之前,我们需要确保服务器环境满足基本要求。首先确认您的服务器已经安装了Nginx,并且拥有一个可用的域名指向该服务器。

检查Nginx版本(建议使用1.15.0以上版本以获得完整HTTP/2支持):

nginx -v

验证服务器80和443端口是否开放:

sudo ufw status

如果防火墙未开放这些端口,可以使用以下命令开启:

sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload

确保您的域名DNS解析已正确设置,可以通过ping命令验证:

ping yourdomain.com

2. 获取Let's Encrypt免费SSL证书

Let's Encrypt是一个免费、自动化且开放的证书颁发机构,由非盈利组织Internet Security Research Group(ISRG)运营。我们将使用Certbot工具来获取和自动续期证书。

首先安装Certbot及其Nginx插件:

sudo apt update sudo apt install certbot python3-certbot-nginx

获取SSL证书(将yourdomain.com替换为您的实际域名):

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot将引导您完成以下步骤:

  1. 输入您的电子邮件地址用于紧急通知
  2. 同意服务条款
  3. 选择是否共享电子邮件地址
  4. 自动验证域名所有权
  5. 选择是否将所有HTTP流量重定向到HTTPS

成功获取证书后,Certbot会自动在Nginx配置中添加SSL相关设置。证书文件通常存储在以下位置:

/etc/letsencrypt/live/yourdomain.com/

包含以下关键文件:

  • fullchain.pem:证书链文件
  • privkey.pem:私钥文件
  • chain.pem:中间证书
  • cert.pem:域名证书

提示:Let's Encrypt证书有效期为90天,但Certbot会自动设置定时任务在证书到期前续期。您可以通过以下命令测试自动续期是否正常工作:

sudo certbot renew --dry-run

3. 配置Nginx支持HTTPS

虽然Certbot已经自动配置了基本SSL设置,但为了获得最佳性能和安全性,我们需要进行更细致的调整。以下是优化后的Nginx配置示例:

server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; # SSL证书配置 ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # SSL协议配置 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_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # OCSP Stapling配置 ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # DH参数增强安全性 ssl_dhparam /etc/nginx/dhparam.pem; # HSTS头(强制HTTPS) add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # 其他安全头 add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; # 网站根目录设置 root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } # 静态资源缓存设置 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; add_header Cache-Control "public, no-transform"; } }

要应用此配置,您需要先生成DH参数文件(这可能需要几分钟时间):

sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048

然后测试Nginx配置并重新加载:

sudo nginx -t sudo systemctl reload nginx

4. 启用HTTP/2协议

HTTP/2是HTTP协议的重大升级,提供了多路复用、头部压缩、服务器推送等特性,可以显著提升网站性能。在Nginx中启用HTTP/2非常简单,只需在listen指令后添加http2参数:

listen 443 ssl http2; listen [::]:443 ssl http2;

验证HTTP/2是否成功启用:

  1. 使用Chrome开发者工具,在Network标签页查看协议列
  2. 使用curl命令:
curl -I https://yourdomain.com

在响应头中应该能看到HTTP/2 200字样

HTTP/2带来的主要优势包括:

特性说明性能提升
多路复用单个连接上并行传输多个请求减少连接建立开销
头部压缩使用HPACK算法压缩HTTP头部减少传输数据量
服务器推送服务器可以主动推送资源减少客户端请求次数
流优先级可以指定资源加载优先级优化关键渲染路径

5. 性能优化与安全加固

5.1 TLS性能优化

TLS握手是HTTPS连接建立过程中最耗时的部分之一。通过以下设置可以显著减少握手时间:

ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off;

5.2 安全加固配置

禁用不安全的协议和加密套件:

ssl_protocols TLSv1.2 TLSv1.3; 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_prefer_server_ciphers on;

启用OCSP Stapling:OCSP Stapling可以减少客户端验证证书状态的时间:

ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s;

添加安全HTTP头:

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";

5.3 静态资源优化

对于静态资源,设置适当的缓存策略可以显著提升性能:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; add_header Cache-Control "public, no-transform"; }

6. 常见问题排查

在配置HTTPS过程中可能会遇到各种问题,以下是一些常见问题及解决方法:

问题1:证书验证失败

  • 检查域名是否正确且DNS解析正常
  • 确保服务器80端口对外开放(Certbot验证需要)
  • 查看Certbot日志:sudo journalctl -u certbot

问题2:混合内容警告

  • 确保网页中所有资源(图片、CSS、JS等)都使用HTTPS URL
  • 可以使用Content Security Policy(CSP)来阻止混合内容:
add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'";

问题3:SSL Labs评分不高

  • 确保使用TLS 1.2/1.3并禁用旧版本
  • 使用强加密套件
  • 启用OCSP Stapling
  • 配置HSTS头

问题4:HTTP/2不工作

  • 确认Nginx版本支持HTTP/2(1.9.5+)
  • 检查配置中是否正确添加了http2参数
  • 确保客户端支持HTTP/2

7. 高级配置与自动化

7.1 多域名配置

如果您需要为多个域名配置HTTPS,可以这样设置:

server { listen 443 ssl http2; server_name domain1.com www.domain1.com; ssl_certificate /etc/letsencrypt/live/domain1.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain1.com/privkey.pem; # 其他配置... } server { listen 443 ssl http2; server_name domain2.com www.domain2.com; ssl_certificate /etc/letsencrypt/live/domain2.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain2.com/privkey.pem; # 其他配置... }

7.2 自动化证书续期

虽然Certbot已经设置了自动续期,但我们可以添加一个钩子脚本在续期后重新加载Nginx配置。创建/etc/letsencrypt/renewal-hooks/post/reload-nginx.sh

#!/bin/bash systemctl reload nginx

然后赋予执行权限:

chmod +x /etc/letsencrypt/renewal-hooks/post/reload-nginx.sh

7.3 监控证书过期

可以设置一个简单的监控脚本来检查证书过期时间:

#!/bin/bash DOMAIN="yourdomain.com" EXPIRY=$(echo | openssl s_client -servername $DOMAIN -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 30 ]; then echo "证书将在$DAYS_LEFT天后过期!" | mail -s "证书过期警告" admin@example.com fi

将此脚本添加到cronjob中定期运行:

0 0 * * * /path/to/check_ssl_expiry.sh

8. 性能测试与验证

配置完成后,建议使用以下工具验证您的HTTPS配置:

  1. SSL Labs测试:https://www.ssllabs.com/ssltest/

    • 提供详细的SSL/TLS配置评估
    • 检查协议支持、加密套件、密钥强度等
  2. HTTP/2测试:https://tools.keycdn.com/http2-test

    • 确认HTTP/2是否正常工作
    • 检查服务器推送等高级功能
  3. WebPageTest:https://www.webpagetest.org/

    • 全面评估网站性能
    • 可视化HTTPS对加载时间的影响
  4. Security Headers检查:https://securityheaders.com/

    • 评估安全HTTP头的配置
    • 提供改进建议
  5. Mozilla Observatory:https://observatory.mozilla.org/

    • 全面的安全配置扫描
    • 根据最佳实践评分

通过这些工具,您可以全面了解当前配置的安全性和性能状况,并根据建议进行进一步优化。