在 CentOS 上为 Nginx 配置 SSL 的完整教程
一 准备与前置检查
- 准备已签发的 SSL 证书文件(常见为 Nginx 目录下的 .crt/.pem 证书文件 与 .key 私钥文件),并确保证书域名与站点域名一致;若证书为“系统生成 CSR”,下载包通常包含多个服务器类型的目录,Nginx 使用其中的证书与密钥。若使用“自己生成 CSR”,请妥善保存本地私钥,下载包中不含 .key。
- 服务器与云安全组需放行 TCP 443 端口,否则即使配置正确也无法访问 HTTPS。
- 确认 Nginx 已安装并启用 http_ssl_module(多数发行包默认包含;从源码编译时需显式加入该模块)。
- 域名已正确解析到服务器 IP,并可通过 http://域名 正常访问(便于后续 301 跳转)。
二 安装 Nginx 与启用 SSL 模块
- 使用系统仓库安装(推荐):
- 安装 EPEL 与 Nginx(部分系统可同时安装 mod_ssl,但对 Nginx 并非必需):
- sudo yum install -y epel-release
- sudo yum install -y nginx
- 从源码编译安装(如需自定义路径或模块):
- 安装编译依赖:sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
- 下载并解压 Nginx 源码,进入目录后配置并启用 SSL 模块:
- ./configure --prefix=/usr/local/nginx --with-http_ssl_module
- make && make install
- 验证模块与版本:
- nginx -V 2>&1 | grep – ‘–with-http_ssl_module’(应能看到该选项)
三 部署证书与配置 HTTPS
- 准备证书目录并上传文件(示例将证书放在 /etc/nginx/cert/):
- sudo mkdir -p /etc/nginx/cert
- 将下载的 domain.crt/domain.pem 与 domain.key 上传至该目录,权限建议 600(仅 root 可读):
- sudo chmod 600 /etc/nginx/cert/*
- 编辑 Nginx 配置(两种常见做法,二选一或合并使用):
- 方式 A:在 /etc/nginx/nginx.conf 的 http 块中新增 server 443(或取消注释 HTTPS 示例):
-
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/nginx/cert/domain.crt;
ssl_certificate_key /etc/nginx/cert/domain.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
- 方式 B:在 /etc/nginx/conf.d/ssl.conf 中单独放置 HTTPS server 配置,保持主配置简洁。
- 可选:HTTP 自动跳转 HTTPS(在 80 端口 server 中):
- server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
- 说明:
- 证书与密钥路径需与上传位置一致;证书文件扩展名可为 .crt/.pem;若使用“已有 CSR”申请,请确保 .key 文件已就位并命名为与证书匹配的 domain.key。
四 验证与生效
- 语法与配置检查:
- 重载或重启 Nginx:
- sudo systemctl reload nginx(或 sudo systemctl restart nginx)
- 访问验证与连通性检查:
- 浏览器访问 https://yourdomain.com,应显示安全锁标识;命令行可测试:curl -I https://yourdomain.com
- 检查端口监听:ss -tlnp | grep ‘:443’(应看到 0.0.0.0:443 或 :::443 处于 LISTEN)
- 如仍无法访问,请再次确认云安全组/本机防火墙已放行 443。
五 进阶与自动化
- 使用 Certbot 自动获取并配置 Let’s Encrypt 证书(适用于公网域名):
- 安装 Certbot 与 Nginx 插件(CentOS 7 常见为 python2-certbot-nginx,CentOS 8/Stream 可用 python3-certbot-nginx):
- sudo yum install -y certbot python2-certbot-nginx
- 获取并自动配置 Nginx:
- sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
- Certbot 会自动创建/修改 80/443 配置、设置 HTTP→HTTPS 跳转 并尝试自动续期(续期可用 systemctl 或 crontab 配合 certbot renew 完成)。
- 安全与优化建议:
- 优先启用 TLSv1.2/TLSv1.3,禁用 SSLv3/TLSv1/TLSv1.1;使用更安全的套件(如 ECDHE 系列),并开启 HSTS(在 server 443 中添加:add_header Strict-Transport-Security “max-age=63072000; includeSubDomains; preload”;)。
- 定期使用 SSL Labs 等工具测试站点评分与配置安全性,并根据结果微调 ciphers 与协议。