排错指南
自签名证书:什么时候没问题,什么时候必须换
证书是自己签给自己的,浏览器不信任。
自签名证书就是自己签给自己的证书:颁发者和使用者是同一个,没有任何第三方为它背书。加密是正常工作的,浏览器警告的不是「不安全」,而是「无法确认对面是谁」。
所以关键问题只有一个:这个服务是给谁用的。内网自用没问题;公网访客能访问到,就必须换。
内网服务:可以继续用
只在内网访问的管理后台、数据库控制台、开发环境,自签名是常见且合理的选择。要消掉警告,把这张证书(或签它的私有根)装进访问方的信任库即可。
- 更好的做法是自建一个私有 CA,再用它签发各服务的证书。这样只需要在每台机器上安装一次根证书,以后换服务证书不用重新安装。
- 机器多的话,把根证书下发做成配置管理的一部分,而不是让每个人手工点「继续访问」。
- 不要让人习惯性点过警告——那会让真正的中间人攻击也被点过去。
公网服务:必须换
公网访客的浏览器不会信任它,而且没有任何服务器配置能改变这一点——信任来自客户端的信任库。访客会看到全屏拦截页,绝大多数人会直接离开。
App 和接口调用的失败更彻底:多数 HTTP 客户端默认校验证书,自签名会直接抛异常,而不是像浏览器那样给一个「继续访问」的入口。
换成公开 CA 签发的证书即可。本站基于 Let's Encrypt 的签发是免费的,支持泛域名,加一条 DNS TXT 记录完成验证,几分钟内签发。
为什么会意外出现自签名证书
- 默认证书没换掉:很多软件安装时会生成一张自签名证书顶上,忘了替换。
- 证书路径写错:配置指向了一个不存在的文件,服务回退到内置的默认证书。
- 新加的域名没配:nginx 匹配不到对应的 server 块,用了默认站点的证书。
- 证书文件被覆盖:部署脚本把测试用的自签名证书发到了生产。
常见问题
检测一下你自己的域名
免登录,一次真实的 TLS 握手,直接给出结论:还有多少天到期、证书链是否完整、是否包含这个域名。
需要一张新证书?本站提供基于 Let's Encrypt 的免费签发,支持泛域名。
了解免费证书其他排错指南
- 证书过期了怎么办浏览器拦下访问,提示证书已过期或连接不是私密连接。
- 证书快到期了:先分清是没续期,还是续了没部署证书还没过期,但剩余天数已经不多了。
- 证书还没到生效时间:多半是时钟不对证书的生效时间还没到,被判定为无效。
- 证书透明度日志里出现了没见过的证书监控期间,域名下出现了不是本站签发的新证书。
- 无法连接:证书检测连不上服务器时的排查顺序检测连不上服务器,没能拿到证书。
- 「您的连接不是私密连接」:先找错误代码,再决定修哪里浏览器弹出红色警告拦下访问,但不知道属于哪一种证书问题。
- 关闭 TLS 1.0 / 1.1,只留 1.2 和 1.3服务器还在使用 TLS 1.0 或 1.1 协商连接。
- 证书不包含这个域名:ERR_CERT_COMMON_NAME_INVALID 的几种成因浏览器提示证书不适用于该网站,或者拿到了另一个站点的证书。
- 电脑打得开、手机 App 报证书错误:证书链缺少中间证书电脑浏览器打得开,手机 App、curl 或 Java 客户端却报证书错误。
- OCSP stapling:开了能快一点,不开也不算故障没有启用 OCSP stapling,首次握手会稍慢一些。
- 证书被吊销,或者链验证没通过证书被吊销,或者链验证没有通过。
- 证书链追溯不到受信任的根:新根交叉签名与私有 CA浏览器打得开,curl、旧安卓或 Java 客户端却说找不到颁发者证书。
- RSA 密钥长度不足:为什么现在才被提醒证书的 RSA 密钥长度低于 2048 位。
- 泛域名证书为什么不覆盖主域名子域名都正常,直接访问主域名却报证书错误。
Last updated on