打开网站,浏览器地址栏直接飘红、弹出 “不安全” 警告,甚至提示 “您与该网站之间的连接不安全”。用户不敢填信息、不敢下单,网站流量断崖式下跌,SEO 权重持续流失 ——90% 的站长遇到过这问题,核心原因就是SSL 证书配置异常。
不同于网上千篇一律的 “点这里、点那里” 流水账教程,本文从报错根源→避坑选型→手把手配置→终极排错全流程拆解,覆盖 Nginx/Tengine 主流服务器,新手也能 1 小时搞定,彻底告别红色警告。
一、先搞懂:红色警告到底为啥?
很多人以为 “装了证书就万事大吉”,实则 90% 的报错都不是 “没装证书”,而是配置细节出错。先分清 3 类核心报错,精准解决不盲目:
1. 证书类报错(最常见)
- NET::ERR_CERT_DATE_INVALID:证书过期,免费证书(如 Let's Encrypt)有效期仅 90 天,忘记续期必报错。
- NET::ERR_CERT_COMMON_NAME_INVALID:证书域名不匹配,比如证书绑定
a.com,却用www.a.com访问;通配符*.a.com不支持多级子域名b.a.a.com。 - 证书链不完整:只装了域名证书,漏了中间证书,手机浏览器必报错,电脑偶尔正常。
2. 配置类报错(最易忽略)
- 混合内容:HTTPS 页面里加载 HTTP 图片、JS、CSS,浏览器直接判 “不安全”。
- 443 端口未放行:服务器防火墙 / 安全组没开 443 端口,证书装了也无法访问。
- 私钥不匹配:证书和私钥(.key)不是一对,上传时搞混文件直接报错。
3. 特殊场景报错
- 自签名证书:测试环境用没问题,公网访问必飘红,浏览器不认可非权威 CA 签发的证书。
- 系统时间错误:服务器时间偏差超过证书有效期范围,误判证书过期。
二、避坑第一步:选对证书,少走 80% 弯路
别盲目选 “免费证书” 或 “最贵证书”,按网站类型 + 域名数量选,适配才不报错:
1. 域名验证(DV)证书:个人 / 小型站首选
- 特点:仅验证域名所有权,10 分钟签发,免费(如 Let's Encrypt、云厂商免费证书)或低价。
- 适用:个人博客、小微企业官网、单域名站点。
- 避坑:免费证书必须设自动续期,否则 90 天后必过期报错。
2. 组织验证(OV)证书:企业站标配
- 特点:验证企业真实信息(营业执照、法人信息),地址栏显示企业名称,信任度高。
- 适用:企业官网、电商平台、需用户留资的站点。
3. 通配符 / 多域名证书:多子域名必备
- 通配符(*.a.com):1 个证书覆盖主域名 + 所有二级子域名(如
www.a.com、admin.a.com)。 - 多域名(SAN):1 个证书绑定多个独立域名(如
a.com、b.com)。 - 避坑:通配符不支持多级子域名(如
b.a.a.com),需单独申请对应证书。
三、手把手:Nginx/Tengine 证书配置(核心实操)
准备工作
-
证书文件:从 CA 机构(云厂商 / Let's Encrypt)下载 Nginx 版本证书,解压后得到 3 个文件:
xxx.pem:域名证书 + 中间证书(合并后完整证书链)。xxx.key:私钥(绝对不能泄露,权限设为 600)。
-
服务器:已安装 Nginx/Tengine,放行 443 端口(防火墙 / 安全组添加规则)。
-
域名:已完成 ICP 备案(国内服务器必填),解析到服务器公网 IP。
步骤 1:创建证书目录,上传文件
bash
运行
# 1. 创建专属目录(路径自定义,统一即可)
sudo mkdir -p /etc/nginx/ssl/yourdomain
# 2. 上传证书文件到该目录(用SFTP/FTP工具)
# 3. 设置权限(仅管理员可读,防止泄露)
sudo chmod 600 /etc/nginx/ssl/yourdomain/*
步骤 2:修改 Nginx/Tengine 配置文件
打开配置文件(nginx.conf或sites-available/xxx.conf),替换以下内容,复制即用:
nginx
# 1. HTTPS核心配置(监听443端口)
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com; # 绑定所有访问域名
# 证书路径(替换为你的实际路径)
ssl_certificate /etc/nginx/ssl/yourdomain/xxx.pem;
ssl_certificate_key /etc/nginx/ssl/yourdomain/xxx.key;
# 安全协议配置(禁用老旧不安全协议)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 会话超时(优化性能)
ssl_session_timeout 10m;
# 网站根目录(替换为你的站点目录)
root /var/www/html;
index index.html index.htm;
# 解决混合内容:自动跳转HTTP资源到HTTPS
add_header Content-Security-Policy "upgrade-insecure-requests";
}
# 2. HTTP强制跳转HTTPS(关键!避免用户访问http://飘红)
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri; # 永久重定向
}
步骤 3:验证配置,重启服务
bash
运行
# 1. 检查配置是否有误(必做!避免重启失败)
nginx -t
# 显示“syntax is ok”则正常,否则检查路径/域名拼写
# 2. 重启Nginx/Tengine生效
sudo systemctl restart nginx
# Tengine用:sudo systemctl restart tengine
步骤 4:验证效果
浏览器访问https://yourdomain.com,地址栏显示安全锁,无红色警告;点击锁图标→证书,查看有效期、域名匹配正常。
四、终极排错:装完仍飘红?按这 5 步查
1. 查证书链是否完整
- 工具:SSL Labs(输入域名检测),或浏览器 “安全锁→证书→证书路径”。
- 解决:重新下载 Nginx 版本证书(含中间证书),替换原文件,重启服务。
2. 查混合内容
- 操作:F12 打开开发者工具→Console,查看 HTTP 资源报错。
- 解决:将所有
http://改为https://;或在配置中添加upgrade-insecure-requests自动升级。
3. 查证书有效期与自动续期
- 免费证书:用 Certbot 设置自动续期,避免过期。
bash
运行
# 安装Certbot(Ubuntu/Debian)
sudo apt install certbot python3-certbot-nginx
# 设置自动续期(每天执行检查)
sudo crontab -e
# 添加一行:0 3 * * * certbot renew --quiet
4. 查域名匹配
- 确认证书 SAN 字段包含所有访问域名(裸域名、www、子域名)。
- 通配符仅匹配二级子域名,多级子域名需单独申请证书。
5. 查服务器时间与端口
- 时间:同步服务器时间,偏差≤5 分钟。
bash
运行
# 同步时间(CentOS)
sudo chronyc makestep
- 端口:放行 443 端口,关闭冲突端口。
五、最后总结:3 个核心避坑要点
- 证书适配:个人站用免费 DV,企业站用 OV,多子域名用通配符,不盲目高价或免费。
- 配置细节:强制 HTTPS 跳转 + 完整证书链 + 混合内容处理,3 个缺一必报错。
- 长期维护:免费证书设自动续期,每月检查证书有效期,避免过期翻车。