HTTPS证书显示"不安全"、域名转发死循环?两大坑一次排清

HTTPS证书显示

一、证书为什么会被标"不安全"

多数情况是证书链拼接不完整:服务器只发了站点证书,没带上中间证书(Intermediate CA),老版本浏览器就会判定"证书不受信任"。另一个常见原因是配置里引用了单独的 cert.pem 而不是完整的 fullchain.pem。此外,域名所有权没验证、证书绑定的域名和实际访问域名不一致,也会触发警告。

二、证书怎么拿、装到哪

普通网站用域名验证(DV)证书就够了,几分钟就能签发。免费渠道有 Let's Encrypt,云平台(阿里云、腾讯云等)也提供免费或付费证书。Let's Encrypt 用 Certbot 自动申请和续期:

安装:sudo apt install certbot
申请:sudo certbot certonly --webroot -w /var/www/html -d yourdomain.com

成功后证书默认在 /etc/letsencrypt/live/yourdomain.com/ 下,关键两个文件:fullchain.pem(证书链,含中间证书)和 privkey.pem(私钥)。配置时务必用 fullchain.pem,别用单独的 cert.pem。

三、显性转发 vs 隐性转发,别乱用

类型地址栏变化实现方式适用场景
显性转发跳转到目标URL301/302 重定向换域名、旧链迁移
隐性转发地址不变反向代理 / 框架页保留原域名展示他站内容

隐性转发若目标站输出绝对链接,容易出现资源加载异常,需额外处理。普通换域名场景,优先用显性 301。

四、Nginx / Apache 配置示例

Nginx 整域跳转(保留原路径):

server { listen 80; server_name olddomain.com; return 301 https://www.newdomain.com$request_uri; }

把 /blog 反向代理到另一台机器:

location /blog { proxy_pass http://192.168.1.100:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }

Apache 走 mod_rewrite 模块做转发,先确认模块已启用再写规则。

五、故障排查清单

  • 浏览器仍报不安全 → 检查是否用了 fullchain.pem,而非单独证书。
  • 转发后循环跳转 → 301/302 是否混用,目标地址是否又指回自己。
  • 资源 404 / 混合内容 → 页面里还有 http:// 资源,需改 https 或加升级策略。
  • 缓存旧状态 → 302 会被浏览器缓存,调试时先用无痕窗口。