Let's Encrypt根证书过期导致Azure Function Node应用API调用失败咨询
故障原因及解决方案
核心故障原因
Node.js 默认使用内置的独立根证书集做TLS校验,不依赖操作系统的证书存储,这也是你删除Windows证书存储里的过期证书没有生效的原因。
2021年Let's Encrypt的DST Root CA X3根证书过期后,老版本Node.js的内置根证书列表仍保留了该过期根证书,同时Let's Encrypt当时为了兼容旧设备,默认给R3中间签的证书附带了交叉链接到DST过期根的证书链,Node校验时会优先匹配到该过期根,直接抛出证书过期错误。
针对你提出的三个问题的答复
- 是Node.js版本的问题:Node.js确实内置独立于操作系统的根证书集,若你使用的Node.js版本低于v12.22.0、v14.17.0、v16.0.0,内置根证书列表未移除过期的DST Root CA X3,就会触发该报错。本地和Azure Function运行环境都出现相同报错,首先要核对两处的Node.js运行时版本是否属于未修复的旧版本。
- 不是Azure侧的默认配置问题:Azure Function的Node运行时版本由你自行选择,只要所选的Node版本内置的根证书集未更新,哪怕宿主系统的证书已经更新,Node仍会用自己内置的旧根证书做校验,触发报错。
- 你需要自行做适配处理,可根据实际场景选择以下方案:
- 优先升级Node.js运行时版本:只要升到v12.22.0+、v14.17.0+、v16.0.0+及以上的任意版本,这些版本已经从内置根证书列表中移除了过期的DST Root CA X3,默认会匹配Let's Encrypt的有效根ISRG Root X1完成校验,直接解决问题。
- 若暂时无法升级Node版本,可添加Node进程环境变量:设置
NODE_OPTIONS=--use-openssl-ca,强制Node放弃内置根证书,改用操作系统的根证书存储校验,只要运行环境的系统根证书已更新到包含有效ISRG Root X1,即可正常校验。 - 也可在请求逻辑中手动指定信任根证书:给
Issuer.discover方法传入配置参数,在httpOptions中添加ca字段,值为ISRG Root X1的证书内容,强制请求时信任该有效根。
你上报的报错信息和触发逻辑完全匹配该场景:openid-client的discover方法底层默认走Node.js原生TLS校验逻辑,拉取OIDC配置的HTTPS请求在校验证书阶段命中过期根,直接抛出certificate has expired错误。
内容的提问来源于stack exchange,提问作者Andrew Shepherd
相关产品推荐
相关产品推荐

