Node.js请求BigBlueButton接口报证书已过期问题咨询
问题原因
- 根证书信任库差异:浏览器、Postman使用操作系统或自身维护的根证书列表,会自动更新信任新签发的根证书;而Node.js使用内置的独立根证书库,低版本Node.js未收录近年新增的根证书,尤其针对使用Let's Encrypt证书的站点,2021年旧的DST Root CA X3根证书过期后,低版本Node.js会误判仍在有效期内的证书过期。
- 服务器证书链不完整:浏览器会自动补全缺失的中间证书,Node.js不会自动补全,证书链缺失也会触发校验失败报过期错误。
- Node.js版本过低:14.x以下的老旧Node.js版本,内置根证书库长期未更新,无法识别近年新的根证书签发机构。
解决方案
1. 优先升级Node.js版本
升级到14.x及以上的最新LTS版本,新版本已内置最新根证书,绝大多数情况下可直接解决该问题。
2. 临时测试方案(生产环境禁用)
在请求参数中关闭SSL证书校验,修改代码如下:
let createApiUrl = `https://bbb.example.com/bigbluebutton/api/create?name=${meetingName}&logoutURL=${logoutUri}&record=true&meetingID=${meetingId}&attendeePW=${attendeePW}&moderatorPW=${moderatorPW}&checksum=${checkSum}`; response = await new Promise((resolve, reject) => { return HTTP.call("GET", `${createApiUrl}`, {strictSSL: false}, (error, response) => { if (error) { reject(error); } else { resolve(response); } }); });
该方案存在中间人攻击风险,仅可用于本地开发调试。
3. 生产环境安全方案
手动指定信任对应根证书,步骤如下:
- 导出BigBlueButton服务器使用的根证书(若为Let's Encrypt证书可直接下载ISRG Root X1证书文件),存为
root.pem放到项目目录 - 修改请求代码,传入证书参数:
const fs = require('fs'); const trustedRootCA = fs.readFileSync('./root.pem'); let createApiUrl = `https://bbb.example.com/bigbluebutton/api/create?name=${meetingName}&logoutURL=${logoutUri}&record=true&meetingID=${meetingId}&attendeePW=${attendeePW}&moderatorPW=${moderatorPW}&checksum=${checkSum}`; response = await new Promise((resolve, reject) => { return HTTP.call("GET", `${createApiUrl}`, {ca: trustedRootCA}, (error, response) => { if (error) { reject(error); } else { resolve(response); } }); });
4. 检查服务端证书配置
执行命令openssl s_client -connect bbb.example.com:443检查证书链是否完整,若返回提示缺少中间证书,需要将域名证书、中间证书拼接后重新配置到BigBlueButton服务器的反向代理服务中。
内容的提问来源于stack exchange,提问作者yazilim egitimevde
相关产品推荐
相关产品推荐

