在Nginx服务器部署SSL证书(Windows)

通过未加密的HTTP协议传输数据,会面临信息泄露、内容篡改等安全风险,并可能被浏览器标记为“不安全”,影响用户信任。在Windows服务器的Nginx上部署SSL证书,可启用HTTPS加密通信,保障数据在传输过程中的机密性与完整性,提升网站的安全性和可信度。本文介绍如何在Windows系统上的Nginx服务器部署SSL证书,以及安装后HTTPS效果验证等。

重要

如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务

适用范围

开始配置前,确保满足以下条件:

  • 证书状态:已拥有由权威机构签发的 SSL 证书。若证书即将过期或已过期,请先续费SSL证书。

  • 域名匹配:确保证书能够匹配所有需保护的域名。如需添加或修改域名,可根据需求购买正式证书追加和更换域名

    • 精确域名:仅对指定域名生效。

      • example.com 仅对 example.com 生效。

      • www.example.com 仅对 www.example.com 生效。

    • 通配符域名:仅对其一级子域名生效。

      • *.example.com 对 www.example.coma.example.com 等一级子域名生效。

      • *.example.com 对根域名 example.com 和多级子域名 a.b.example.com 不生效。

    说明

    如需匹配多级子域名,绑定域名中需包含该域名(如 a.b.example.com),或包含相应的通配符域名(如 *.b.example.com)。

  • 服务器权限:需要使用 Administrator 账户或一个具有管理员权限的账户。

  • 域名备案与解析

    • ICP 备案:域名已完成工信部 ICP 备案(仅适用于中国内地服务器)。

    • 域名解析:域名已通过 A 记录解析至服务器的公网 IP。

    说明

    可访问网络诊断分析工具,输入域名,检查 DNS 服务商解析结果备案检查项,确保满足要求。

  • 环境依赖:本文以Widows Server 2025操作系统、Nginx-1.28.0为例介绍。本文中Nginx的示例安装目录为D:\nginx-1.28.0

    说明

    不同版本的操作系统或Web服务器,部署操作可能有所差异。

操作步骤

步骤一:准备SSL证书

  1. 进入SSL证书管理页面,在目标证书操作列单击更多进入证书详情页面,然后在下载页签中下载服务器类型Nginx的证书。

  2. 解压下载的证书压缩包:

    • 若同时包含证书文件(.pem)和私钥文件(.key),请妥善保存上述文件,后续部署时均需使用。

    • 若仅包含证书文件(.pem),不含私钥文件(.key),需配合您本地保存的私钥文件一起部署。

      说明

      若申请证书时使用 OpenSSL、Keytool 等工具生成 CSR 文件,私钥文件仅保存在您本地,下载的证书包中不包含私钥。如私钥遗失,证书将无法使用,需重新购买正式证书并生成CSR和私钥。

  3. 将解压后的证书文件和私钥文件上传至服务器,并存放在一个安全的外部目录(本文示例路径为D:\cert)。

    说明

    以下操作以阿里云 ECS 为例,其它类型的服务器请参考其官方文档。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入服务器桌面。

    3. 单击服务器左下角开始菜单,查找并打开名为此电脑计算机文件资源管理器的选项。

    4. 双击重定向的驱动程序和文件夹下的***上的workbench,从本地拖动证书文件至该目录,然后右键刷新文件夹。

      image

    5. 将目标文件复制到D:\cert目录。

      重要

      重新连接、退出实例时,Workbench会自动清除该实例重定向的驱动程序和文件夹中已上传的所有文件信息以节省空间,该目录仅用于文件传输,请不要保存文件。

步骤二:配置系统与网络环境

  1. 开放安全组的 443 端口。

    重要

    若您的服务器部署在云平台,请确保其安全组已开放入方向 443 端口 (TCP),否则外部无法访问服务。以下操作以阿里云 ECS 为例,其他云平台请参考其官方文档。

    1. 进入云服务器ECS实例页面,选择目标 ECS 实例所在地域,单击目标实例名称,进入实例详情页。

    2. 单击安全组 > 内网入方向全部规则,确保存在一条授权策略允许协议类型为 TCP、目的端口范围为 HTTPS(443)、授权对象任何位置(0.0.0.0/0)的规则。

    3. 如不存在上述规则,请参照添加安全组规则在目标安全组中添加相应规则。

  2. 开放服务器防火墙的443端口。

    1. 登录Windows服务器,单击左下角开始菜单,打开控制面板

    2. 点击系统和安全 > Windows防火墙 > 检查防火墙状态

    3. 如果防火墙处于如下图的关闭状态,无需额外操作。image

    4. 如果防火墙已开启,请参考以下步骤放行HTTPS规则。

      1. 单击左侧高级设置 > 入站规则,检查是否存在协议TCP,本地端口443,操作阻止的入站规则。

      2. 若存在此类规则,需要右键单击相应规则并选择属性,在常规页签,将其修改为允许连接应用

      3. 更多防火墙配置,请参见配置防火墙规则

步骤三:在Nginx服务器部署证书

  1. 打开配置文件,在 Nginx 中配置 SSL 证书和私钥文件(本文示例路径为D:\nginx-1.28.0\conf\nginx.conf)。

    1. 添加监听 443 端口的 server 块。

      将现有监听 80 端口的 server 块复制为新的配置块,修改其监听端口为 listen 443 ssl,并补充 SSL 证书配置(包括 ssl_certificatessl_certificate_key 指令),其余配置项维持不变。

      # 原有监听 80 端口的 server 块
      server {
          listen 80;
          server_name yourdomain.com www.yourdomain.com;
          
          # 其它配置
          location / {
              proxy_pass http://127.0.0.1:8000;
          }
      }
      
      # 复制已有监听 80 端口的 server 块,新增为一个新的 server 块
      server {
          # 将原有 listen 80 修改为 listen 80 改为 listen 443 ssl
          listen 443 ssl;
          # 原有 server_name,可继续新增更多当前证书支持的域名
          server_name yourdomain.com www.yourdomain.com;
          
          # ======================= 证书配置开始 =======================
          # 指定证书文件(中间证书可以拼接至该pem文件中),请将以下路径替换为您实际使用的证书文件的绝对路径
          ssl_certificate D:\\cert\\example.com.pem;
          # 指定私钥文档,请将以下路径替换为您实际使用的私钥文件的绝对路径
          ssl_certificate_key D:\\cert\\example.com.key;
          # 配置 SSL 会话缓存,提高性能
          ssl_session_cache shared:SSL:1m;
          # 设置 SSL 会话超时时间
          ssl_session_timeout 5m;
          # 自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
          ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
          # 指定允许的 TLS 协议版本,TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差
          ssl_protocols TLSv1.2 TLSv1.3;
          # 优先使用服务端指定的加密套件
          ssl_prefer_server_ciphers on;
          # ======================= 证书配置结束 =======================
         
          # 其它配置
      }
    2. 可选:设置HTTP请求自动跳转到HTTPS。在原有监听80端口的server宽中添加rewrite指令即可。

      server {
          listen 80;
          #填写证书绑定的域名
          server_name <YOURDOMAIN>;
          #将所有HTTP请求通过rewrite指令重定向到HTTPS。
          rewrite ^(.*)$ https://$host$1;
          location / {
              index index.html index.htm;
          }
      }
    3. 执行以下命令验证配置文件的修改是否合法。若输出syntax is oktest is successful则表示测试通过,否则需根据提示修正配置,直至测试通过。

      .\nginx.exe -t
  2. 重载Nginx服务。

    打开Windows命令行,进入Nginx安装目录,执行以下命令。

    .\nginx.exe -s reload 

步骤四:验证部署结果

  1. 请通过 HTTPS 访问您已绑定证书的域名(如 https://yourdomain.comyourdomain.com 需替换为实际域名)。

  2. 若浏览器地址栏显示安全锁图标,说明证书已成功部署。如访问异常或未显示安全锁,请先清除浏览器缓存或使用无痕(隐私)模式重试。

    image

    Chrome 浏览器自 117 版本起,地址栏中的image已被新的image替代,需单击该图标后查看安全锁信息。

说明

如仍有问题,请参考常见问题进行排查。

应用于生产环境

在生产环境部署时,遵循以下最佳实践可提升安全性、稳定性和可维护性:

  • 使用非管理员权限用户运行

    为应用创建专用的、低权限的系统用户,切勿使用拥有管理员权限的账户运行应用。

    说明

    建议使用网关层配置 SSL的方案,即将证书部署在负载均衡SLB上,由其终结 HTTPS 流量,再将解密后的 HTTP 流量转发到后端应用。

  • 凭证外部化管理

    切勿将密码等敏感信息硬编码在代码或配置文件中。使用环境变量、Vault 或云服务商提供的密钥管理服务来注入凭证。

  • 启用 HTTP 到 HTTPS 强制跳转

    确保所有通过 HTTP 访问的流量都被自动重定向到 HTTPS,防止中间人攻击。

  • 配置现代 TLS 协议

    在服务器配置中禁用老旧且不安全的协议(如 SSLv3, TLSv1.0, TLSv1.1),仅启用 TLSv1.2 和 TLSv1.3。

  • 证书监控与自动续期

    建议在证书部署完成后,为域名开启域名监控功能。阿里云将自动检测证书有效期,并在证书到期前发送提醒,帮助您及时续期,避免服务中断。具体操作请参见购买并开启公网域名监控

常见问题

安装或更新证书后,证书未生效或 HTTPS 无法访问

常见原因如下:

  • 域名未完成备案。请参见ICP备案流程

  • 服务器安全组或防火墙未开放 443 端口。请参见配置系统与网络环境

  • 证书的绑定域名未包含当前访问的域名。请参见域名匹配

  • 修改 Nginx 配置文件后,未重载(reload) Nginx 服务。具体操作可参见重载 Nginx 服务

  • 证书文件未正确替换,或 Nginx 配置未正确指定证书路径。请检查 Nginx 配置文件和所用证书文件是否为最新且有效。

  • 域名已接入 CDN、SLB 或 WAF 等云产品,但未在相应产品中安装证书。请参阅流量经过多个云产品时证书的部署位置完成相关操作。

  • 当前域名的 DNS 解析指向多台服务器,但证书仅在部分服务器上安装。需分别在每个服务器中安装证书。

如何更新(替换)Nginx 中已安装的 SSL 证书

请先备份服务器上原有的证书文件(.pem 和 .key),然后登录数字证书管理服务控制台,下载新的证书文件(.pem 和 .key),并上传到目标服务器覆盖原有文件(确保路径和文件名一致)。最后,重载(reload)Nginx 服务,使新证书生效。

如何在 Nginx 中关闭 TLSv1.0 和 TLSv1.1 以避免部分浏览器提示“证书不符合标准”

在 Nginx 监听 443 端口的 server 块中,将 ssl_protocols 仅保留 TLSv1.2 和 TLSv1.3,最终配置为ssl_protocols TLSv1.2 TLSv1.3;。此时将禁用不安全的 TLSv1.0 和 TLSv1.1。配置完成后,执行 .\nginx.exe -s reload 使设置生效。

执行 nginx -s reload 后,Nginx启动失败或日志中出现 bind() to 0.0.0.0:443 failed 错误。

此为端口冲突问题。请使用 netstat -ano | findstr ":443" 命令确认443端口是否被占用,并停止占用该端口的服务。

网站可以通过HTTPS访问,但浏览器地址栏没有显示安全锁,或提示“混合内容”警告。

原因为网页中加载了通过HTTP协议引用的资源(如图片、CSS、JS文件)。检查网页源代码,将所有 http://\ 链接修改为 https://\ 或使用相对路径(例如 /images/logo.png)。