Ubuntu Debian系统安装与配置指南
海外云服务器 40个地区可选 亚太云服务器 香港 日本 韩国
云虚拟主机 个人和企业网站的理想选择 俄罗斯电商外贸虚拟主机 赠送SSL证书
在当今互联网环境下,网站安全已成为开发者与运维人员必须高度重视的核心议题,随着用户对隐私保护意识的增强以及主流浏览器对非加密网站的“不安全”标记,部署HTTPS已不再是可选项,而是现代Web服务的基本标准。
HTTPS通过SSL/TLS协议实现客户端与服务器之间的数据加密传输,有效防止中间人攻击、会话劫持和敏感信息泄露,作为全球最流行的高性能Web服务器之一,Nginx广泛应用于各类网站架构中,无论是静态资源服务还是反向代理场景,支持HTTPS都至关重要。
本文将系统讲解如何为Nginx配置SSL证书,涵盖两种主要方式:使用OpenSSL生成自签名证书(适用于测试环境) 和 利用Let’s Encrypt免费获取受信任的公开证书(推荐用于生产环境),同时提供高级安全配置建议,帮助你构建一个安全、可靠且合规的HTTPS服务。
SSL/TLS证书基础概念
SSL(Secure Sockets Layer)是早期的安全通信协议,其后续演进版本为TLS(Transport Layer Security),目前普遍统称为SSL/TLS,该协议通过公钥加密机制,在客户端与服务器之间建立安全连接。
SSL证书是一种由权威机构签发的数字凭证,包含以下关键信息:
- 域名(Common Name 或 Subject Alternative Names)
- 公钥
- 有效期(起止时间)
- 颁发机构(CA, Certificate Authority)
- 签名算法等元数据
当用户访问HTTPS站点时,浏览器会验证证书是否由可信CA签发、域名是否匹配、是否过期等,若一切正常,则建立加密通道进行通信;否则将提示安全警告。
⚠️ 注意:自签名证书未被主流浏览器信任,仅适合内网或开发测试用途;正式上线网站应使用权威CA签发的证书。
环境准备
在开始配置前,请确保已完成以下准备工作:
-
安装并运行Nginx服务
根据操作系统选择对应命令:
# CentOS/RHEL 7/8 sudo yum install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
# Ubuntu/Debian sudo apt update sudo apt install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
-
确认域名解析正确
确保你的域名(如
example.com)已通过DNS解析指向当前服务器IP地址,这是申请公共证书的前提条件。 -
开放防火墙端口
开放HTTP(80)和HTTPS(443)端口:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
方法一:生成自签名SSL证书(适用于测试/开发环境)
自签名证书无需第三方认证,创建简单快捷,常用于本地开发、内部系统或演示项目,但由于缺乏信任链,浏览器会显示“您的连接不是私密连接”警告,不适合面向公众的生产环境。
使用OpenSSL生成密钥与证书
首先创建SSL证书存储目录:
sudo mkdir -p /etc/nginx/ssl
执行以下命令生成2048位RSA私钥及自签名证书,有效期设为365天:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/nginx-selfsigned.key \ -out /etc/nginx/ssl/nginx-selfsigned.crt
执行过程中会提示输入一些基本信息,其中最关键的是 Common Name (CN),请填写你要保护的域名(example.com),其他字段可按需填写或留空。
✅ 提示:如果需要支持多个子域名,可在后续使用SAN(Subject Alternative Name)扩展功能,但自签名证书仍无法避免浏览器警告。
配置Nginx启用HTTPS
编辑Nginx站点配置文件(路径可能因系统而异):
sudo vim /etc/nginx/conf.d/default.conf
添加如下HTTPS server块:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
# 推荐使用的TLS版本
ssl_protocols TLSv1.2 TLSv1.3;
# 安全加密套件
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
# 会话缓存优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
测试并重启Nginx
验证配置语法无误后重新加载服务:
sudo nginx -t sudo systemctl reload nginx
此时可通过 https://example.com 访问网站,虽然浏览器提示证书不受信任,但数据传输已在加密通道中完成。
方法二:使用Let’s Encrypt获取免费可信SSL证书(推荐用于生产环境)
Let’s Encrypt 是一个非营利性、自动化、开放的证书颁发机构,致力于推动全网HTTPS普及,它提供的证书被所有主流浏览器信任,且完全免费。
配合 Certbot 工具,可以一键完成证书申请、自动配置Nginx并设置定期续期,极大简化运维工作。
安装Certbot及其Nginx插件
根据不同发行版安装依赖包:
# Ubuntu/Debian sudo apt update sudo apt install certbot python3-certbot-nginx -y
# CentOS/RHEL(需启用EPEL源) sudo yum install epel-release -y sudo yum install certbot python3-certbot-nginx -y
自动申请并配置SSL证书
运行以下命令为指定域名申请证书:
sudo certbot --nginx -d example.com -d www.example.com
Certbot 将自动执行以下操作:
- 扫描现有的Nginx配置
- 向Let’s Encrypt发起证书申请
- 验证域名所有权(通过HTTP-01挑战)
- 更新Nginx配置以启用HTTPS
- 可选地将HTTP请求重定向至HTTPS(强烈建议开启)
过程中需提供管理员邮箱,用于接收证书到期提醒和紧急通知。
检查自动续期机制
Let’s Encrypt证书有效期仅为 90天,但Certbot默认会创建定时任务(cron job),每30天尝试自动续期。
手动测试续期功能是否正常:
sudo certbot renew --dry-run
若输出显示“Congratulations, all renewals succeeded”,说明自动续期机制已就绪。
🔔 建议:定期检查
/var/log/letsencrypt/letsencrypt.log日志,确保无人值守续期稳定运行。
高级安全配置建议
为进一步提升HTTPS安全性,可在Nginx中加入以下最佳实践配置:
# 启用强加密协议 ssl_protocols TLSv1.2 TLSv1.3; # 使用高强度加密套件 ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES128-GCM-SHA256; # 不优先使用服务器端加密套件(兼容性考虑) ssl_prefer_server_ciphers off; # 启用SSL会话缓存,提高性能 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTS(HTTP Strict Transport Security)强制浏览器始终使用HTTPS add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # 防止MIME类型嗅探攻击 add_header X-Content-Type-Options nosniff; # 防止点击劫持(Clickjacking) add_header X-Frame-Options DENY; 安全策略(CSP),可根据实际需求调整 add_header Content-Security-Policy "default-src 'self'; script-src 'self' https:; object-src 'none';";
💡 建议使用


