nginx配置https关键在三步:生成私钥与csr、合并完整证书链并存放到安全目录、在server块中正确配置listen 443 ssl、ssl_certificate、ssl_certificate_key及http跳转;需确保私钥600权限、证书为pem格式且路径为绝对路径。

想让网站跑在 HTTPS 上,Nginx 配置其实不难,关键在三步:生成私钥、创建证书签名请求(CSR)、把证书和私钥放对位置并正确引用。整个过程不需要编程基础,只要会敲几条命令、改一行配置就行。
生成私钥和 CSR 文件
这是部署 HTTPS 的起点。私钥必须严格保密,CSR 则用来向证书机构申请证书(或自己签发)。
- 运行命令生成 2048 位 RSA 私钥(无密码,避免 Nginx 启动时卡住):
openssl genrsa -out example.com.key 2048 - 再用它生成 CSR 文件,过程中会提示填信息,Common Name 必须填你的域名(如 www.example.com 或 example.com):
openssl req -new -key example.com.key -out example.com.csr - 填信息时注意:
• Country Name:填 CN
• State/Province:填拼音,如 Guangdong
• Locality:填城市拼音,如 Shenzhen
• Organization Name:可填公司或个人名称(英文或拼音)
• Common Name:必须与你将要访问的网址完全一致(含 www 或不含 www)
获取并整理证书文件
拿到证书后,通常有两个核心文件:一个证书(.crt 或 .pem),一个私钥(.key)。但浏览器信任链依赖“完整证书链”,所以推荐把域名证书和中间证书合并成一个文件。
- 如果你从腾讯云、阿里云等平台下载的 Nginx 包,一般包含:
• example.com_bundle.crt(已含域名证书 + 中间证书)或
• example.com.crt(仅域名证书)+ ca-bundle.crt(中间证书) - 手动合并(若只有单独的域名证书):
cat example.com.crt ca-bundle.crt > fullchain.pem - 私钥文件必须是未加密格式(开头为 -----BEGIN PRIVATE KEY----- 或 -----BEGIN RSA PRIVATE KEY-----)。如果生成时加了密码,需先移除:
openssl rsa -in example.com.key -out example.com.key.nopass
然后用 example.com.key.nopass 替代原私钥
把文件放好、设对权限
Nginx 对证书路径和文件权限很敏感,放错地方或权限不对都会启动失败。
- 统一存到安全目录,比如:
sudo mkdir -p /etc/nginx/ssl
sudo cp fullchain.pem /etc/nginx/ssl/example.com.crt
sudo cp example.com.key.nopass /etc/nginx/ssl/example.com.key - 设置权限(重点!):
sudo chmod 644 /etc/nginx/ssl/example.com.crt
sudo chmod 600 /etc/nginx/ssl/example.com.key
私钥必须是 600,否则 Nginx 拒绝加载,报 “permission denied”
写一个能跑通的 HTTPS server 块
打开你的站点配置文件(如 /etc/nginx/sites-available/default 或 /etc/nginx/conf.d/my-site.conf),加入以下最小可用配置:
- 监听 443 端口,启用 SSL 和 HTTP/2:
listen 443 ssl http2; - 指定证书和私钥路径:
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key; - 启用安全协议(兼容主流浏览器):
ssl_protocols TLSv1.2 TLSv1.3; - (可选但推荐)加 HSTS 头强制 HTTPS:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 别忘了配一个 HTTP → HTTPS 跳转(防止用户手动输 http):
server { listen 80; return 301 https://$host$request_uri; }
保存后,检查语法:sudo nginx -t,没问题就重载:sudo nginx -s reload。打开浏览器访问 https://your-domain.com,应该能看到锁图标了。











