Node.js使用passport-azure-ad验证access token报本地颁发者证书错误
"authentication failed due to: Error: unable to get local issuer certificate"
错误触发根因
该错误本质是Node.js的TLS校验环节无法找到Azure AD签名证书对应的根CA证书,无法完成完整的证书链校验,常见触发场景如下:
- 运行环境处于有SSL劫持的企业内网/代理环境,代理替换了HTTPS流量的证书,Node默认根证书库不包含代理的自签名CA
- 使用的Node.js版本过旧,内置根证书库未收录Azure AD当前使用的根CA
- passport-azure-ad配置错误,关闭了默认的证书校验规则,或配置了错误的元数据地址
适配不同场景的解决方案
场景1:本地开发临时排查(禁止生产环境使用)
可临时关闭全局TLS证书校验快速验证问题,启动服务时添加环境变量即可:NODE_TLS_REJECT_UNAUTHORIZED=0 node your-server.js
风险提示:该配置会跳过所有HTTPS请求的证书校验,存在严重的中间人攻击风险,仅可用于本地临时排查,绝对不能用于生产环境。
场景2:内网代理/自定义CA环境
将内网代理的根CA证书或自定义CA证书加入Node的信任证书库,启动时通过环境变量指定证书路径:NODE_EXTRA_CA_CERTS=/path/to/your/custom-root-ca.crt node your-server.js
容器部署场景可将CA证书提前打入镜像,在启动指令中配置对应环境变量即可。
场景3:修复passport-azure-ad配置
检查BearerStrategy的初始化配置,确保元数据地址、校验规则配置正确,参考配置如下:
const { BearerStrategy } = require('passport-azure-ad'); const azureAdOptions = { identityMetadata: 'https://login.microsoftonline.com/<你的租户ID>/v2.0/.well-known/openid-configuration', clientID: '<你的应用客户端ID>', audience: '<你的接口受众标识>', validateIssuer: true, passReqToCallback: false, loggingLevel: 'warn' }; passport.use(new BearerStrategy(azureAdOptions, (token, done) => { // 自定义校验逻辑 return done(null, token); }));
如果使用的是Azure AD V1版本的接口,对应修改identityMetadata为V1版本的元数据地址即可。
场景4:Node版本过旧
升级Node.js到16.x及以上的LTS版本,旧版本Node的内置根证书库可能未收录Azure AD近年更换的根CA证书,升级后即可解决默认根证书缺失的问题。
内容的提问来源于stack exchange,提问作者WakandaKing
相关产品推荐
相关产品推荐

