本文详细介绍如何在 Linux 环境下,为 Nginx 或 Tengine 服务器安装 SSL 证书,实现 HTTPS 安全访问。内容涵盖证书的下载与上传、服务器配置步骤、密钥参数设置、安装效果验证,以及常见问题的排查与处理方法。
如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务。
适用范围
开始配置前,确保满足以下条件:
- 证书状态:已拥有由权威机构签发的 SSL 证书。若证书即将过期或已过期,请先续费SSL证书。 
- 域名匹配:确保证书能够匹配所有需保护的域名。如需添加或修改,请参见追加和更换域名。 - 精确域名:仅对指定域名生效。 - example.com仅对- example.com生效。
- www.example.com仅对- www.example.com生效。
 
- 通配符域名:仅对其一级子域名生效。 - *.example.com对- www.example.com、- a.example.com等一级子域名生效。
- *.example.com对根域名- example.com和多级子域名- a.b.example.com不生效。
 
 说明- 如需匹配多级子域名,绑定域名中需包含该域名(如 - a.b.example.com),或包含相应的通配符域名(如- *.b.example.com)。
- 服务器权限:需要使用 - root账户或一个具有- sudo权限的账户。
- 域名备案与解析: - ICP 备案:域名已完成工信部 ICP 备案(仅适用于中国内地服务器)。 
- 域名解析:域名已通过 A 记录解析至服务器的公网 IP。 
 说明- 可访问网络诊断分析工具,输入域名,检查 DNS 服务商解析结果和备案检查项,确保满足要求。 
操作步骤
步骤一:准备SSL证书
- 进入SSL证书管理页面,在目标证书操作列单击更多进入证书详情页面,然后在下载页签中下载服务器类型为Nginx的证书。 
- 解压下载的证书压缩包: - 若同时包含证书文件(.pem)和私钥文件(.key),请妥善保存上述文件,后续部署时均需使用。 
- 若仅包含证书文件(.pem),不含私钥文件(.key),需配合您本地保存的私钥文件一起部署。 说明- 若申请证书时使用 OpenSSL、Keytool 等工具生成 CSR 文件,私钥文件仅保存在您本地,下载的证书包中不包含私钥。如私钥遗失,证书将无法使用,需重新购买正式证书并生成CSR和私钥。 
 
- 将解压后的证书文件(.pem)和私钥文件(.key)上传至服务器,并存放在一个安全的外部目录( - /etc/ssl/cert目录)。说明- 您可以使用远程登录工具的本地文件上传功能来上传文件。例如PuTTY、Xshell或WinSCP等工具。如果您使用的是阿里云云服务器 ECS,关于上传文件的具体操作,请参见上传或下载文件。 
步骤二:配置系统与网络环境
确保安全组和防火墙允许外部流量访问。
- 在服务器终端执行以下命令,检测443端口的开放情况: - RHEL/CentOS- command -v nc > /dev/null 2>&1 || sudo yum install -y nc # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443- 如果输出 - Ncat: Connected to <当前服务器公网 IP>:443,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。- Debian/Ubuntu- command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443- 若输出 - Connection to <当前服务器公网 IP> port [tcp/https] succeeded!或- [<当前服务器公网 IP>] 443 (https) open,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。
- 在安全组配置开放443端口。 重要- 若您的服务器部署在云平台,请确保其安全组已开放 443 端口 (TCP),否则外部无法访问服务。以下操作以阿里云 ECS 为例,其他云平台请参考其官方文档。 - 进入云服务器ECS实例,单击目标实例名称进入实例详情页面,请参考添加安全组规则,在安全组中添加一条授权策略为允许、协议类型为 TCP、目的端口范围为 HTTPS(443)、授权对象为任何位置(0.0.0.0/0)的规则。 
- 在防火墙中开放443端口。 - 执行以下命令,识别系统当前的防火墙服务类型: - if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then echo "firewalld" elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then echo "ufw" elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then echo "nftables" elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then echo "iptables" elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then echo "iptables" else echo "none" fi- 若输出为 - none,则无需进一步操作。否则,请根据输出的类型(- firewalld、- ufw、- nftables、- iptables),执行以下命令开放 443 端口:- firewalld- sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload- ufw- sudo ufw allow 443/tcp- nftables- sudo nft add table inet filter 2>/dev/null sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/null- iptables- sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT- 为避免 iptables 规则在系统重启后失效,请执行以下命令持久化 iptables 规则: - RHEL/CentOS- sudo yum install -y iptables-services sudo service iptables save- Debian/Ubuntu- sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
步骤三:安装 SSL 证书到 Nginx
- 为 Nginx 安装 SSL 模块。 - 执行以下命令,若输出 - --with-http_ssl_module则说明已安装 SSL 模块,否则需进行安装。- nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'说明- 若系统提示 - nginx: command not found,请根据 Nginx 的实际安装路径(如- /usr/local/nginx/sbin/nginx)运行命令,例如:- /usr/local/nginx/sbin/nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'。- 请根据 Nginx 的安装方式(编译安装或包管理工具安装),选择对应的 SSL 模块安装方法: 重要- 在升级 Nginx 过程中,Nginx 服务可能会短暂中断,影响线上业务。 
- 请务必提前备份所有 Nginx 配置文件和站点数据,并选择业务低峰期操作,完成升级后及时恢复配置并验证服务正常。 
 - 包管理工具安装- 在服务器终端执行以下命令: - RHEL/CentOS- # 添加 Nginx 官方仓库 sudo tee /etc/yum.repos.d/nginx.repo <<EOF [nginx-stable] name=nginx stable repo baseurl=https://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF # 升级 Nginx sudo yum upgrade nginx- Debian/Ubuntu- # 升级 Nginx sudo apt-get update sudo apt-get install --only-upgrade nginx- 编译安装- 安装依赖包。 - RHEL/CentOS- sudo yum install -y gcc pcre-devel zlib-devel openssl-devel- Debian/Ubuntu- sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
- 查看当前 Nginx 编译参数。 - nginx -V- 记录 - configure arguments:后的所有参数,后续重新编译时需要全部保留。
- 下载与当前 Nginx 版本一致的源码包。 - 执行 - nginx -v查看当前 Nginx 版本(以 1.14.2 为例)。然后下载当前 Nginx 版本所对应的源码包并解压:- wget http://nginx.org/download/nginx-1.14.2.tar.gz tar -zxvf nginx-1.14.2.tar.gz cd nginx-1.14.2
- 重新编译 Nginx,添加 SSL 模块。 - 在前面步骤复制的参数( - configure arguments:后的所有参数)基础上,加上- --with-http_ssl_module,重新配置和编译:- # 注意:一定要保留所有原有参数,以免丢失现有功能模块。 ./configure <原有参数> --with-http_ssl_module make说明- 若在执行 make 时出现错误 - error: ‘ENGINE_by_id’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations],说明 Nginx 某些代码在 OpenSSL 3.0 及以上版本中已被标记为废弃,编译器将其视为错误。可通过以下命令忽略此类警告,完成编译:- make CFLAGS='-Wno-error=deprecated-declarations'。
- 替换 nginx 可执行文件。 - 备份原有 nginx(以原有 nginx 可执行文件路径为 - /usr/local/nginx/sbin/nginx为例):- # 请将 /usr/local/nginx/sbin/nginx 替换为 nginx 文件的实际路径 sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak- 覆盖原有 nginx 可执行文件: - # 请将 /usr/local/nginx/sbin/nginx 替换为 nginx 文件的实际路径 sudo cp objs/nginx /usr/local/nginx/sbin/nginx
- 验证 SSL 模块是否安装成功。 - nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'- 若输出 - --with-http_ssl_module则说明 SSL 模块已安装成功。
 
- 在 Nginx 中配置 SSL 证书和私钥文件。 重要- 本文以 Nginx 1.14.2 版本、配置文件路径 - /etc/nginx/nginx.conf为例进行说明,其同样适用于与 Nginx 配置兼容的 Tengine。如需查找配置文件的位置,请参见如何查找 Nginx 使用的配置文件。- 执行以下命令打开配置文件。 - sudo vim /etc/nginx/nginx.conf
- 添加监听 443 端口的 server 块。 - 将现有监听 80 端口的 server 块复制为新的配置块,修改其监听端口为 - listen 443 ssl,并补充 SSL 证书配置(包括- ssl_certificate和- ssl_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文件中),请将 /etc/ssl/cert/ssl.pem 替换为您实际使用的证书文件的绝对路径 ssl_certificate /etc/ssl/cert/ssl.pem; # 指定私钥文档,请将 /etc/ssl/cert/ssl.key 替换为您实际使用的私钥文件的绝对路径 ssl_certificate_key /etc/ssl/cert/ssl.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; # ======================= 证书配置结束 ======================= # 其它配置 }
- 可选:设置 http 请求自动跳转到 https。在原有监听 80 端口的 - server块中添加- return指令即可。- # 原有监听 80 端口的 server 块 server { listen 80; server_name yourdomain.com www.yourdomain.com; # 设置HTTP请求自动跳转到HTTPS return 301 https://$host$request_uri; # 原有其它配置 }
- 执行以下命令验证配置文件的合法性与正确性。若输出 - syntax is ok和- test is successful则表示测试通过,否则需根据提示修正配置,直至测试通过。- sudo nginx -t -c /etc/nginx/nginx.conf
 
- 重载 Nginx 服务。 重要- 本文以 Nginx 使用默认配置文件路径启动为例。如有自定义安装路径或配置文件,请根据实际情况相应调整命令和路径。 - 请根据 Nginx 当前的运行状态选择合适的操作: - 若 Nginx 服务已启动- 执行以下命令可重新加载 Nginx 配置文件,无需重启服务进程且不中断现有连接。如重载失败,请参考常见问题进行排查。 - sudo nginx -s reload- 若 Nginx 服务未启动- 执行以下命令以启动 Nginx 服务。 - nginx
步骤四:验证部署结果
- 请通过 HTTPS 访问您已绑定证书的域名(如 - https://yourdomain.com,- yourdomain.com需替换为实际域名)。
- 若浏览器地址栏显示安全锁图标,说明证书已成功部署。如访问异常或未显示安全锁,请先清除浏览器缓存或使用无痕(隐私)模式重试。  - Chrome 浏览器自 117 版本起,地址栏中的  已被新的 已被新的 替代,需单击该图标后查看安全锁信息。 替代,需单击该图标后查看安全锁信息。
如仍有问题,请参考常见问题进行排查。
应用于生产环境
在生产环境部署时,遵循以下最佳实践可提升安全性、稳定性和可维护性:
- 使用非管理员权限用户运行: - 为应用创建专用的、低权限的系统用户,切勿使用拥有管理员权限的账户运行应用。 说明- 建议使用网关层配置 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 解析指向多台服务器,但证书仅在部分服务器上安装。需分别在每个服务器中安装证书。 
如需进一步排查,请参考:根据浏览器错误提示解决证书部署问题 和 SSL证书部署故障自助排查指南。
如何更新(替换)Nginx 中已安装的 SSL 证书
请先备份服务器上原有的证书文件(.pem 和 .key),然后登录数字证书管理服务控制台,下载新的证书文件(.pem 和 .key),并上传到目标服务器覆盖原有文件(确保路径和文件名一致)。最后,重载(reload)Nginx 服务,使新证书生效。
如何查找 Nginx 使用的配置文件
在终端执行 ps -ef | grep '[n]ginx: master' | grep -- ' -c ',若输出类似 -c /etc/nginx/custom.conf,则 Nginx 使用的是 /etc/nginx/custom.conf 配置文件;否则执行 nginx -V 2>&1 | grep -oP -- '--conf-path=[^ ]*'查看其默认配置文件路径(如 --conf-path=/etc/nginx/nginx.conf,表示默认使用 /etc/nginx/nginx.conf)。
如何在 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 -s reload 使设置生效。
nginx -t 检查配置时报错:bind() to 0.0.0.0:443 failed (98: Address already in use)
这个错误表示 443 端口已被其他程序占用。执行 sudo ss -tlnp | grep :443 命令查找占用端口的进程,并根据情况停止或修改该进程的配置。常见的占用者可能是另一个 Web 服务器(如 Apache)或一个未正常关闭的 Nginx 进程。
测试配置文件报错:cannot load certificate "/etc/nginx/ssl/domain.pem" : BIO_new_file() failed
证书文件 /etc/nginx/ssl/domain.pem 的路径不正确,请将 Nginx 配置文件中的证书文件路径修改为正确的地址。
重载(reload)Nginx 时报错:the "ssl" parameter requires ngx_http_ssl_module
您需要为 Nginx 安装 SSL 模块,具体操作请参见为 Nginx 安装 SSL 模块。
重载(reload)Nginx 时报错:No such file or directory:fopen('/cert/3970497_demo.aliyundoc.com.pem','r') error
证书文件 /cert/3970497_demo.aliyundoc.com.pem 路径不正确,请将 Nginx 配置文件中的证书文件路径修改为正确的地址。
重载(reload)Nginx 时报错:permission denied
检查 Nginx 配置文件(如 nginx.conf)中,user指令所指定的用户(如 nginx)是否有权限访问证书文件及目录。