浏览器证书错误的解决方法有哪些?
SSL证书这个东西,说白了就是网站的身份证。你去银行办业务,柜员要看你的身份证,浏览器访问一个网站,也要看它的证书。证书上写明了这个网站是谁的、域名是什么、有效期到什么时候,还有一个叫“证书颁发机构”的单位在上面签了字,证明这个证书是真实有效的。浏览器出厂的时候,系统里已经预装了一百多个受信任的根证书,这些根证书来自全球公认的权威机构。当你访问一个网站,服务器会把它的证书发过来,浏览器就顺着证书链往上查,看最终能不能追到一个自己信任的根证书。如果这个过程顺利,浏览器就在地址栏给你亮一把绿色的小锁;如果中间出了岔子,它就会毫不客气地把整个访问拦下来,先给你看警告页面。
这个验证机制其实挺严谨的,但严谨就意味着敏感。任何一个环节出问题,浏览器都会翻脸。用户这边最常见也最容易解决的问题,就是系统时间不对。刚才说的那台电脑的纽扣电池没电,就是一个典型。证书上有两个时间戳——生效日期和失效日期,浏览器在验证证书的时候,会用你电脑上显示的时间去判断证书是否在有效期内。如果你的电脑时间比实际时间早了或者晚了一年,明明刚签发没多久的有效证书,浏览器会认为它还没生效或者已经过期了。解决方法很简单,Windows用户点开右下角的时间设置,打开“自动设置时间”和“自动设置时区”两个开关,再点一下“立即同步”,让系统跟微软的时间服务器对一下表就行了。Mac用户在系统设置里找到“日期与时间”,同样开启自动同步。大部分情况下,做完这一步,重启浏览器再访问那个网站,红色的警告页面就变成正常的网页了。
如果时间没问题,那就要考虑浏览器缓存了。浏览器为了提高访问速度,会把一些数据存到本地,其中就包括网站的证书信息。当你访问一个网站,浏览器会先把本地缓存里的证书拿出来用,而不是每次都重新从服务器获取。这种机制在大多数时候没问题,但如果网站的证书刚换过,而你的浏览器里还存着旧证书的信息,就会发生冲突——浏览器拿着旧证书去验证,发现跟服务器那边对不上,于是报错。这种情况有个很简单的判断方法:你打开浏览器的无痕模式或者隐私窗口,再次访问那个网站。如果无痕模式下能正常打开,但普通模式下报错,那基本可以确定是缓存的问题。在Chrome里按Ctrl+Shift+Delete(Mac上是Command+Shift+Delete),在弹出的窗口里选中“缓存的图片和文件”和“Cookie及其他网站数据”,时间范围选“所有时间”,然后点击清除数据。清除完成之后关闭并重启浏览器,问题一般就能解决。
有些时候,问题不在系统,也不在缓存,而在于浏览器本身或者你装的那些插件。浏览器扩展程序虽然好用,但有些插件会在你访问网页的时候插入自己的脚本或者修改网络请求,干扰正常的SSL握手过程。广告拦截类插件、代理类插件、安全防护类插件是这类问题的重灾区。如果你装了这类插件,可以试试暂时把它们全部禁用,然后重新加载那个报错的网站。如果恢复正常了,就挨个启用插件,找到到底是哪一个在捣乱,然后考虑换一个替代品或者调整它的设置。另外,老版本的浏览器也可能因为不支持新的加密协议而报错,比如有些旧设备上的Chrome版本太老,无法正确处理某些新CA机构签发的证书。这时候最简单的办法就是检查一下浏览器有没有更新,有的话就升级到最新版。同时,操作系统本身的更新也很重要,因为操作系统的根证书存储库会随着系统更新而同步更新,一个几年没打过补丁的系统,它的根证书列表可能早就过时了,新出现的CA机构它压根不认识。
以上这些都是用户端可以自己动手解决的问题,但还有一类证书错误,跟你的电脑和浏览器一点关系都没有,问题出在网站那边。作为普通用户,你遇到这种情况其实挺无奈的,因为你除了关掉页面,也没有什么别的办法。但如果这个网站是你自己运营的,那这些问题就属于你必须面对的责任了。
网站这边最常见的问题,毫无悬念,是证书过期。SSL证书不是永久有效的,它有明确的有效期。以前证书最长可以用三年,后来行业标准收紧,现在最长只有十三个月,免费证书通常只有九十天。很多网站管理员买了证书往服务器上一装,就再也没管过,直到某天早上打开网站,发现满屏都是红色警告,才想起来证书已经过期了。解决的办法就是登录证书管理平台,查看证书的到期日期,如果已经过期或者快过期了,就赶紧申请续期,然后把新证书部署到服务器上,重启Web服务让新证书生效。为了防止以后再出现同样的问题,一定要设置到期提醒,提前三十天、十五天、七天各提醒一次,或者直接用支持自动续期的工具,比如用Certbot配合Let‘s Encrypt,可以做到全程自动化,证书快过期了它自己就去续期,根本不用你操心。
还有一种常见的情况是证书跟域名对不上。你申请证书的时候填的是example.com,但你的网站同时又绑定了www.example.com,或者你启用了blog.example.com这样的子域名,而证书里并没有包含它们。这时候访问者不管是用www还是用子域名打开你的网站,浏览器都会发现证书上写的域名跟地址栏里输入的域名不一样,于是毫不留情地报错。解决方案是在申请证书的时候,确认好你到底需要保护哪些域名。如果既有主域名又有www,最好申请一张同时包含两者的证书,或者直接申请通配符证书,比如*.example.com,这样可以覆盖主域名下的所有子域名,一劳永逸。对于已经部署的证书,可以在浏览器里点开地址栏旁边的小锁,查看证书详情,看看“颁发给”那一栏到底写的是哪个域名,如果跟你实际使用的域名不一致,就得重新申请一张匹配的证书。
服务器配置上的问题往往更隐蔽。有时候你的证书没到期,域名也对得上,但浏览器还是报错“证书不受信任”,这通常意味着证书链不完整。证书链这个概念听起来有点抽象,但理解起来并不难。你可以把根证书想象成最高级别的权威,它在浏览器出厂的时候就已经被预装好了。但根证书不会直接给你的网站签名,中间还有一层中间证书,根证书先给中间证书签名,中间证书再给你的网站证书签名,这样就形成了一条信任链。网站管理员在部署证书的时候,如果只把网站自己的证书传上去了,而忘了把中间证书也一并配置好,浏览器拿到你的证书之后,往上追溯信任链,发现中间缺了一环,找不到通往根证书的路,于是判定这个证书不可信。修复这个问题的方法是在服务器配置里把网站证书和中间证书合并成一个文件,确保浏览器在拿到你的证书的同时也能拿到中间证书。以Nginx为例,你需要把站点证书和中间证书按顺序合并成一个fullchain.crt文件,然后在配置文件的ssl_certificate指令里指向这个合并后的文件,最后重新加载Nginx配置。Apache的配置思路类似,只是具体指令略有不同。修复完成后,可以用SSL Labs的在线工具检测一下,它会告诉你证书链是否完整、中间证书是否齐全。
还有一种证书错误,是网站使用了自签名证书。自签名证书就是网站管理员自己用软件生成的证书,没有经过任何权威机构的审核和签名。这种证书在内部测试环境里用用没问题,但一旦部署到公网上,浏览器就会拒绝信任——因为没有任何一个预装的根证书能验证它的合法性。如果你是在开发环境里测试自己的项目,临时遇到这种情况,可以在浏览器的高级选项里找到“继续访问”或者“添加例外”,手动允许继续访问。但如果你的网站需要对公众开放,那就别偷懒了,去申请一个免费的Let‘s Encrypt证书,九十天有效期,支持自动续期,而且被所有主流浏览器信任,分分钟就能搞定,何必让自己的用户面对那个吓人的红色警告页面呢?
除了网站自身的问题,有时候用户的网络环境也会导致证书错误。比如在公共Wi-Fi里,如果网络被劫持了,攻击者可能会伪造一个假的证书来拦截你的通信。这种情况下,浏览器检测到证书的签发机构跟自己信任的根证书列表对不上,就会弹出警告。还有些企业或学校的网络会启用SSL拦截功能,网关上用自己的证书替换掉网站的原始证书,用来做内容审计或安全过滤。如果这台网关的证书没有正确安装到你的设备上,你的浏览器也会报错。遇到这种情况,除非你明确知道自己在做什么,否则最好立刻断开当前网络,换到其他网络环境再试。
让人头疼的是,有时候证书明明已经更新了,浏览器还是报错。这可能是因为浏览器缓存了旧证书的信息,也可能是操作系统或者应用程序本身缓存了证书状态。Windows系统里有一个专门的SSL状态缓存,位置在控制面板的Internet选项里,打开后切换到“内容”选项卡,就能看到一个“清除SSL状态”的按钮,点一下就能清掉系统级别的SSL缓存。macOS用户可以通过钥匙串访问工具来管理证书,找到相关的证书条目,手动删除或者更新。这些操作听起来有点技术含量,但跟着步骤做一遍就会发现其实没那么复杂。
证书错误的影响,远比一个红色的警告页面要严重得多。对于个人用户来说,它意味着你无法正常访问某个网站,可能需要花时间去排查问题,或者干脆放弃访问。对于运营网站的企业来说,后果就更加严重了。有研究表明,当用户遇到SSL证书错误时,网站的跳出率会超过85%,很多用户看到红色警告页面就直接关掉了,根本不会去点那个“高级”选项。对于电商网站来说,如果在结账流程中出现证书错误,购物车放弃率几乎接近100%——谁愿意在一个被浏览器标记为“不安全”的网站上输入自己的信用卡信息呢?更可怕的是,这种信任损伤是持续性的,即使网站后来修复了证书问题,那些曾经看到过红色警告页面的用户,下次再来的时候心里也会打鼓,转化率可能在很长一段时间里都恢复不到原来的水平。搜索引擎也会对证书失效的网站进行降权处理,因为搜索引擎的爬虫跟普通浏览器一样,也会检查网站的证书状态。如果一个网站的证书过期了,搜索引擎会认为这个网站可能被入侵或者维护不善,从而降低它的搜索排名。
说了这么多,其实可以总结出一个简单的排查思路。当你遇到浏览器证书错误的时候,先别慌,按照从易到难的顺序一步步来。第一步,检查你电脑的时间对不对,把自动同步时间打开。第二步,清除浏览器的缓存和Cookie,或者直接开无痕模式试试。第三步,检查一下你的浏览器和操作系统是不是最新版本,该升级就升级。第四步,暂时禁用所有浏览器扩展,特别是广告拦截和安全类的插件。如果这些步骤都试过了还是不行,那问题很可能出在网站那边,你作为普通用户能做的事情就很有限了,最多就是联系网站管理员告诉他们证书出了问题。
如果你本身就是那个网站的管理员,那你的责任就更重了。证书管理这件事听起来不起眼,但它直接关系到你的网站能不能被正常访问、你的用户愿不愿意信任你。把证书管理纳入常规的运维流程,设置到期提醒,使用自动化续期工具,定期用SSL检测工具检查证书链和配置的正确性,这些都是应该做的基础工作。证书不过是一段数字签名和一串加密密钥,但当它出问题的时候,给业务带来的冲击却是实实在在的,绝不是小事一桩。
CN
EN