Nuxt.js搭配Axios直接打开首页报证书过期,路由跳转访问正常如何解决?
问题分析与修复方案
访问结果差异的核心逻辑
- 直接访问首页、普通
<a>标签跳转首页:两种场景均触发Nuxt服务端渲染(SSR)流程,首页依赖的推特信息流数据由服务端Node进程主动请求https://example.org:5000/tweets接口获取,错误在服务端请求阶段触发 - 带
nuxt-link-active类的链接是Nuxt内置nuxt-link组件渲染生成,点击时走客户端路由跳转逻辑,仅在用户浏览器侧完成页面渲染,推特接口请求由浏览器发起,不会触发服务端逻辑,因此无报错
证书过期报错的根因
浏览器直接访问example.org:5000/tweets正常,仅服务端Node请求报错,本质是Node服务端的根证书信任库与浏览器的信任库不同步:
从报错日志判断,服务端运行的是老旧的Node 8.x版本,近期Let's Encrypt旧根证书DST Root CA X3过期后,旧版Node的根证书信任库仍优先校验该过期证书,直接抛出CERT_HAS_EXPIRED错误;而现代浏览器早已移除该过期根证书,会正常校验Let's Encrypt新的ISRG Root X1根证书,因此浏览器访问接口无异常。
该问题无代码变更也会突发,完全是证书信任链过期导致的。
修复方案
临时应急方案
修改服务端Axios请求配置,添加rejectUnauthorized: false关闭证书校验,快速恢复业务:
const https = require('https') const axios = require('axios').create({ baseURL: 'https://example.org:5000/', httpsAgent: new https.Agent({ rejectUnauthorized: false }) })
注意:该方案存在安全风险,仅适合临时救急,不可长期在线上环境使用
长期稳定方案
- 升级服务端Node版本至12.x及以上LTS版本,新版Node已移除过期的DST Root CA X3根证书,默认信任ISRG Root X1根证书
- 重新为5000端口服务签发HTTPS证书,调整证书信任链优先适配新的ISRG Root X1根证书
- 也可将服务端内部接口调用改为内网HTTP地址,绕开HTTPS证书校验逻辑,性能也更优
内容的提问来源于stack exchange,提问作者Namey
相关产品推荐
相关产品推荐

