Node.js中转API:首次调用成功,二次调用遇证书域名不匹配问题
问题分析与解决方案
核心原因
你的Node.js服务器在第二个接口/scheduleJobs中,直接将前端请求的req.headers原封不动转发给了Filemaker的HTTPS接口,其中包含了**Host: localhost**这个请求头。而Filemaker服务器的SSL证书绑定的域名是xxx,当它收到Host: localhost的请求时,会触发证书域名不匹配的校验错误,这就是你看到Hostname/IP does not match certificate's altnames报错的原因。
第一个接口/login能成功,是因为你转发的是前端传来的req.body(仅包含自定义的几个请求头),没有携带Host: localhost这类本地请求头,所以证书校验能正常通过。
Python脚本无问题,是因为Python请求库默认不会将本地请求的Host头直接转发到目标HTTPS服务器,自然不会触发证书域名冲突。
修复步骤
修改Node.js服务器中/scheduleJobs的代码,不要直接传递完整的req.headers,只提取业务所需的请求头(比如认证头、内容类型头):
app.post("/scheduleJobs", async (req, res) => { const body = req.body; // 仅提取需要转发的请求头,排除Host、Origin等本地相关头 const forwardHeaders = { 'Content-Type': req.headers['content-type'], 'Authorization': req.headers['authorization'] }; await axios.post("https://xxx/fmi/data/vLatest/databases/xxxx/layouts/xxx/_find", body, { headers: forwardHeaders } ) .then(function(response) { res.send(response.data); }) .catch(e => { console.log(e); res.status(500).send(e.message); // 新增错误处理,避免请求挂起 }); });
补充说明
- 你之前设置
rejectUnauthorized = false没生效,是因为该配置需要加在Node.js向Filemaker发起的HTTPS请求中,而非前端axios请求(前端请求的是本地HTTP服务器,不存在证书校验)。如果需临时跳过校验(不推荐生产环境使用),可修改Node端axios配置:const https = require('https'); // ... await axios.post(url, body, { headers: forwardHeaders, httpsAgent: new https.Agent({ rejectUnauthorized: false }) }) - 生产环境建议确保Filemaker服务器的SSL证书包含正确的访问域名,或通过证书绑定的域名访问服务,从根源避免证书校验问题。
内容的提问来源于stack exchange,提问作者Exterasmors
相关产品推荐
相关产品推荐

