为网站启用HTTPS是当前的基本要求,不仅能加密数据传输保护用户隐私,还能提升搜索引擎排名。本文介绍在搬瓦工VPS的Nginx上配置SSL证书的完整流程,包括使用certbot自动申请免费证书和手动安装商业证书两种方式。
Certbot是Let's Encrypt官方推荐的证书管理工具,可自动申请和配置SSL证书。
安装Certbot:
# Debian/Ubuntu
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
# CentOS/AlmaLinux
sudo yum install epel-release -y
sudo yum install certbot python3-certbot-nginx -y
申请并自动配置证书:
sudo certbot --nginx -d example.com -d www.example.com
Certbot会自动完成以下操作:向Let's Encrypt申请证书、将证书文件保存到 /etc/letsencrypt/live/example.com/、修改Nginx配置文件添加SSL相关指令、设置HTTP到HTTPS的自动跳转。
按照提示输入邮箱地址(用于证书到期通知),同意服务条款,选择是否将HTTP重定向到HTTPS(建议选择重定向)。
如果使用商业证书或需要手动控制配置,可以按以下步骤操作。
上传证书文件:
# 创建证书存放目录
sudo mkdir -p /etc/nginx/ssl/example.com
# 将证书文件上传到服务器
# fullchain.pem - 完整证书链(包含中间证书)
# privkey.pem - 私钥文件
配置Nginx启用SSL:
server {
listen 80;
server_name example.com www.example.com;
# HTTP自动跳转HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
# 证书文件路径
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
# SSL协议和加密套件
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;
ssl_prefer_server_ciphers on;
# SSL会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
基础SSL配置完成后,可以进一步优化安全性:
server {
listen 443 ssl;
server_name example.com;
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;
# HSTS - 强制浏览器使用HTTPS(开启后建议长期维护证书)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# OCSP Stapling - 加速证书验证
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;
resolver_timeout 5s;
# DH参数(增强前向保密)
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# 安全响应头
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
}
生成DH参数文件(首次运行需要几分钟):
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
如果Nginx作为反向代理,SSL终端在Nginx处理,后端应用无需配置HTTPS:
server {
listen 443 ssl;
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;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
后端应用通过 X-Forwarded-Proto 头判断原始请求是否为HTTPS,避免在应用层面重复处理SSL。
配置完成后,检查Nginx配置并重新加载:
# 检查配置语法
sudo nginx -t
# 重新加载
sudo nginx -s reload
使用以下方式验证SSL是否生效:
https://example.com,查看地址栏是否显示锁图标curl -I https://example.comfullchain.pem 而非 cert.pem,确保包含中间证书Tip: 证书自动续期配置请参考 Let's Encrypt自动续期教程。更多教程请查看新手教程。