HTTPS 已经成为网站安全的基石。无论是线上业务还是本地开发为 Nginx 启用 HTTPS 都能加密数据传输、提升用户信任。本文将从零开始带你完成证书准备、Nginx 配置、强制跳转的全流程并针对Windows 10环境提供专门的自签名证书方案。一、选择 SSL 证书的方式在配置 HTTPS 前你需要获得 SSL 证书和私钥。根据使用场景有以下三种选择类型适用场景浏览器信任获取方式Let’s Encrypt 免费证书公网正式服务✅ 完全信任使用 Certbot 或 Win-acme 自动申请商业 SSL 证书电商、银行等高信任要求✅ 完全信任从权威 CA如 DigiCert购买自签名证书本地开发、内部测试❌ 提示不安全使用 OpenSSL 或 mkcert 生成若你需要完全没有浏览器警告的自签名证书请参考后文“Windows 上生成受信任的自签名证书”章节。二、Nginx 启用 HTTPS 的基本配置无论你使用哪种证书Nginx 的配置核心都是监听 443 端口并指定ssl_certificate和ssl_certificate_key。server { listen 443 ssl http2; server_name yourdomain.com; # SSL 证书配置使用绝对路径 ssl_certificate /etc/nginx/ssl/yourdomain.crt; # 证书文件 ssl_certificate_key /etc/nginx/ssl/yourdomain.key; # 私钥文件 # 基础站点配置 root /var/www/html; index index.html; location / { try_files $uri $uri/ 404; } }关键点listen 443 ssl表示开启 SSL 加密。证书路径建议使用绝对路径避免相对路径引起的错误。在Windows系统下路径分隔符请使用正斜杠/例如C:/nginx/conf/ssl/server.crt。三、Windows 10 上生成受浏览器信任的自签名证书无安全警告在本地开发时自签名证书总是被浏览器警告“不安全”非常烦人。推荐两种方案生成系统级信任的证书。 方案一使用 mkcert最简单mkcert专为开发环境设计可一键安装本地 CA 并签发证书。安装 mkcert从 GitHub Releases 下载mkcert-v*-windows-amd64.exe重命名为mkcert.exe放到C:\tools并将该目录添加至 PATH。安装本地 CA以管理员身份运行 PowerShellmkcert-install生成服务器证书为你的域名/IPmkcert localhost192.168.1.100执行后会生成localhost1.pem(证书) 和localhost1-key.pem(私钥)。配置 Nginxssl_certificate C:/nginx/conf/ssl/localhost1.pem; ssl_certificate_key C:/nginx/conf/ssl/localhost1-key.pem;️ 方案二使用 OpenSSL 手动生成完全可控如果希望自己掌握 CA 和证书的全部细节可使用 OpenSSL。安装 OpenSSL使用winget快速安装管理员终端wingetinstall-e--idShiningLight.OpenSSL.Light若winget失败可从 slproweb.com 手动下载安装。生成根证书及服务器证书详细步骤略但核心命令如下# 生成根CA私钥和证书openssl genrsa-outrootCA.key2048openssl req-x509-new-nodes-keyrootCA.key-sha256-days3650-outrootCA.crt# 生成服务器私钥和CSR并用根CA签发openssl genrsa-outserver.key2048openssl req-new-keyserver.key-outserver.csr-configserver.csr.cnf openssl x509-req-inserver.csr-CArootCA.crt-CAkeyrootCA.key-CAcreateserial-outserver.crt-days1825-sha256-extfileserver.csr.cnf-extensionsv3_req安装根证书到 Windows“受信任的根证书颁发机构”右键rootCA.crt→ 安装证书 → 本地计算机 → 放入“受信任的根证书颁发机构”。完成上述步骤后浏览器访问https://localhost将显示安全锁。四、强制使用 HTTPS禁止 HTTP 访问启用 HTTPS 后通常你希望所有流量都只走 HTTPS用户输入http://时要么自动跳转要么直接拒绝。方法一HTTP 自动跳转 HTTPS推荐配置两个server块80 端口负责重定向443 端口负责实际请求。server { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name yourdomain.com; # ... SSL 及其他配置 }方法二彻底关闭 HTTP拒绝访问删除或注释所有listen 80;的 server 块或者返回 403/444。server { listen 80 default_server; server_name _; return 403; # 返回禁止访问 # return 444; # Nginx 特有直接关闭连接无任何响应 }增强安全启用 HSTSHSTS 强制浏览器在指定时间内只使用 HTTPS 访问你的站点防止降级攻击。server { listen 443 ssl; add_header Strict-Transport-Security max-age31536000; includeSubDomains; preload always; # ... 其他配置 }添加该头后浏览器会记住该站点必须通过 HTTPS 访问甚至不会先发起 HTTP 请求。五、完整配置示例包含安全优化下面是一个生产级 Nginx HTTPS 配置集成了强制跳转、HSTS 和现代 TLS 安全指南。# HTTP 强制重定向到 HTTPS server { listen 80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } # HTTPS 主要服务 server { listen 443 ssl http2; server_name example.com www.example.com; # 证书路径 ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; # TLS 安全配置 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_session_cache shared:SSL:10m; ssl_session_timeout 1d; # HSTS (强制 HTTPS) add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; # 站点根目录 root /var/www/example.com/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } }六、常见问题排查1. 证书不被信任浏览器显示“不安全”自签名证书必须将根证书安装到操作系统的“受信任的根证书颁发机构”。Let’s Encrypt/商业证书检查证书是否与域名匹配中间证书是否完整推荐使用fullchain.pem。2. 无法访问 443 端口检查防火墙规则允许443/tcp入站。检查是否有其他程序占用 443 端口netstat -ano | findstr :443。3. Nginx 启动报错 “SSL_CERTIFICATE” 路径问题Windows 下路径必须使用正斜杠/例如C:/nginx/conf/ssl/server.crt。确保 Nginx 进程有读取证书文件的权限。4. 重定向循环Too many redirects检查是否在 HTTPS 配置中也写了return 301 https://...这会导致无限重定向。使用 HSTS 时确认没有其他中间件干扰重定向逻辑。总结为 Nginx 启用 HTTPS 并实现强制加密访问核心步骤可以概括为获取有效证书 → 配置 443 端口监听 → 设置 HTTP 到 HTTPS 的重定向 → 启用 HSTS 等安全头。公网服务推荐 Let’s Encrypt Certbot 自动管理。本地开发推荐 mkcert 或 OpenSSL 自建 CA彻底告别浏览器警告。安全加固禁用旧 TLS 协议、启用 HSTS 和 OCSP Stapling。按照本文操作你就能搭建一个安全、可靠、对用户友好的 HTTPS 网站。如果在实践中遇到具体问题欢迎查阅 Nginx 官方文档或根据报错信息进行针对性排查。Nginx 启用 HTTPS 完全指南从证书申请到强制跳转Windows/Linux 告别“不安全”警告手把手教你配置 Nginx HTTPS实现全站加密前言随着互联网安全意识的提升HTTPS 已经成为网站标配。无论是线上业务还是本地开发为 Nginx 启用 SSL/TLS 加密都能保护数据传输安全、提升用户信任。本文将全面介绍Nginx 启用 HTTPS 的完整流程并特别针对Windows 10/11环境提供详细的本地开发证书配置方案。阅读完本文你将学会获取 SSL 证书的三种方式Let’s Encrypt / 商业证书 / 自签名在 Linux 和 Windows 上配置 Nginx HTTPS使用mkcert或OpenSSL生成浏览器信任的自签名证书强制所有流量走 HTTPSHTTP 跳转或直接拒绝安全加固HSTS、TLS 版本等一、SSL 证书的选择在配置 HTTPS 之前你需要拥有 SSL 证书和对应的私钥。根据使用场景以下三种方案任选其一证书类型适用场景浏览器信任成本获取方式Let’s Encrypt公网正式服务✅ 完全信任免费CertbotLinux / Win-acmeWindows商业证书电商、银行等✅ 完全信任付费从 DigiCert、GlobalSign 等购买自签名证书本地开发、内网测试❌ 默认不安全免费OpenSSL / mkcert 生成可手动信任推荐线上环境使用 Let’s Encrypt本地开发使用mkcert生成受系统信任的证书彻底解决浏览器警告。二、通用 Nginx HTTPS 配置Linux / Windows无论使用哪种证书Nginx 的 HTTPS 配置核心都是相同的监听443 ssl端口并指定证书和私钥路径。2.1 最小化配置示例server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/your/server.crt; # 证书文件 ssl_certificate_key /path/to/your/server.key; # 私钥文件 location / { root /var/www/html; index index.html; } }2.2 完整的安全增强配置生产推荐server { listen 443 ssl http2; server_name yourdomain.com; # 证书路径 ssl_certificate /etc/nginx/ssl/yourdomain.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.key; # TLS 协议和加密套件 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_session_cache shared:SSL:10m; ssl_session_timeout 1d; # HSTS强制浏览器 HTTPS 访问 add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; # 其他站点配置 root /var/www/html; index index.html; }注意Windows 下文件路径必须使用正斜杠/例如C:/nginx/conf/ssl/server.crt。三、Windows 10/11 上生成受信任的自签名证书在 Windows 上进行本地开发时默认的自签名证书会被浏览器标记为“不安全”影响调试体验。以下两种方法可以生成系统级别信任的证书浏览器地址栏显示安全锁。3.1 方法一使用 mkcert最简单mkcert是一个专门为开发环境设计的零配置工具自动安装本地 CA 并签发证书。步骤下载 mkcert访问 https://github.com/FiloSottile/mkcert/releases下载mkcert-v*-windows-amd64.exe。将其重命名为mkcert.exe并放置到C:\tools目录需要将此目录添加到系统 PATH 环境变量。安装本地 CA以管理员身份运行 PowerShell 或 CMDmkcert-install执行后会在系统中安装一个根证书并自动加入“受信任的根证书颁发机构”。生成服务器证书为你的本地域名或 IP 生成证书例如mkcert localhost 127.0.0.1 192.168.1.100执行后当前目录会生成localhost2.pem证书和localhost2-key.pem私钥。配置 Nginx将证书文件复制到 Nginx 配置目录如C:\nginx\conf\ssl\然后编辑nginx.confserver { listen 443 ssl; server_name localhost; ssl_certificate C:/nginx/conf/ssl/localhost2.pem; ssl_certificate_key C:/nginx/conf/ssl/localhost2-key.pem; location / { root html; index index.html; } }重启 Nginxnginx-s reload访问https://localhost你将看到安全锁图标。3.2 方法二使用 OpenSSL 手动生成灵活可控如果你希望完全掌控证书生成过程或需要配置 SAN 扩展支持多域名/IP可以使用 OpenSSL。3.2.1 安装 OpenSSL在 Windows 上可以通过winget快速安装 OpenSSL以管理员身份运行终端winget search openssl# 查找可用包winget install-e--id ShiningLight.OpenSSL.Light# 安装精简版如果winget不可用也可以从 slproweb.com 手动下载安装程序。安装完成后将 OpenSSL 的bin目录如C:\Program Files\OpenSSL-Win64\bin添加到系统 PATH 环境变量并重新打开终端验证openssl version3.2.2 生成根证书Root CA并签发服务器证书1. 创建根证书openssl genrsa-out rootCA.key 2048 openssl req-x509-new-nodes-key rootCA.key-sha256-days 3650-out rootCA.crt-subj/CCN/STBeijing/LBeijing/OMyDev/CNMyDevCA2. 创建服务器证书配置文件server.csr.cnf[req] default_bits 2048 prompt no default_md sha256 distinguished_name dn req_extensions v3_req [dn] CCN STBeijing LBeijing OMyDev OUDev CNlocalhost [v3_req] basicConstraints CA:FALSE keyUsage nonRepudiation, digitalSignature, keyEncipherment subjectAltName alt_names [alt_names] DNS.1 localhost DNS.2 *.localhost IP.1 127.0.0.1 IP.2 192.168.1.1003. 生成服务器私钥和证书请求CSRopenssl genrsa-out server.key 2048 openssl req-new-key server.key-out server.csr-config server.csr.cnf4. 使用根证书签发服务器证书openssl x509-req-inserver.csr-CA rootCA.crt-CAkey rootCA.key-CAcreateserial-out server.crt-days 1825-sha256-extfile server.csr.cnf-extensions v3_req5. 将根证书安装到 Windows“受信任的根证书颁发机构”双击rootCA.crt文件点击“安装证书”。选择“本地计算机” → “将所有的证书都放入下列存储” → 浏览 → 选择“受信任的根证书颁发机构”。完成导入。6. 配置 Nginx使用生成的server.crt和server.key即可。四、强制使用 HTTPS禁止 HTTP 访问开启 HTTPS 后通常需要确保所有流量都走加密通道。有两种常见实现方式4.1 自动跳转推荐通过 301 永久重定向将所有 HTTP 请求转到 HTTPS。对用户友好也有利于 SEO。server { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name yourdomain.com; # ... SSL 配置 }4.2 直接拒绝 HTTP 访问如果不需要任何 HTTP 访问可以关闭 80 端口或返回错误码。server { listen 80 default_server; server_name _; return 403; # 返回 403 禁止访问 # 或使用 return 444; # Nginx 特有直接关闭连接不返回任何响应 }4.3 启用 HSTSHTTP Strict Transport SecurityHSTS 告诉浏览器在未来一段时间内强制使用 HTTPS 访问避免降级攻击。在 HTTPS server 块中添加响应头add_header Strict-Transport-Security max-age31536000; includeSubDomains; preload always;max-age要求浏览器记住的时间秒。includeSubDomains对所有子域名生效。preload允许将站点提交到浏览器的 HSTS 预加载列表。⚠️注意启用preload后如果后续需要关闭 HTTPS 会非常困难请谨慎使用。五、常见问题与排查5.1 浏览器提示“证书不受信任”原因自签名证书未安装到系统信任根证书域名与访问的 URL 不匹配证书过期。解决使用mkcert重新生成并确保执行mkcert -install或手动安装根证书。5.2 Nginx 启动报错cannot load certificateWindows 路径问题必须使用正斜杠/例如C:/nginx/conf/ssl/server.crt或使用双反斜杠C:\\nginx\\conf\\ssl\\server.crt。权限问题确保 Nginx 进程通常是 SYSTEM 或当前用户有读取证书文件的权限。5.3 80 或 443 端口被占用netstat-ano|findstr :80 netstat-ano|findstr :443根据 PID 结束占用进程或者在任务管理器中关闭相关程序如 IIS、VMware 等。5.4 重定向循环Too many redirects检查是否在 HTTPS 配置中错误地添加了return 301 https://...。确认负载均衡或 CDN 没有重复重定向。5.5 Windows 防火墙阻挡 HTTPS创建入站规则控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → TCP 443 → 允许连接。六、总结通过本文你已经掌握了✅ 不同场景下 SSL 证书的获取方案✅ Nginx HTTPS 基本及安全配置✅ 在 Windows 上使用mkcert或OpenSSL生成浏览器信任的自签名证书告别“不安全”警告✅ 强制流量走 HTTPS 的方法重定向 / 拒绝 / HSTS✅ 常见问题的排查技巧最佳实践建议线上生产环境使用 Let’s Encrypt Certbot 自动申请与续期配合 HSTS 和 TLS 1.3。Windows 本地开发首选mkcert一条命令搞定证书信任。安全配置底线禁用 TLS 1.0/1.1启用 HSTS使用强加密套件。如果本文对你有帮助欢迎点赞、收藏、转发。遇到问题可以在评论区留言我会尽力解答。 参考资料Nginx 官方文档 - HTTPSmkcert GitHubLet’s Encrypt 官网SSL Labs 安全测试1