Node- / ExpressJS - 无法获得授权代码:无法获得本地颁发者证书

Node- / ExpressJS - Could not obtain grant code: unable to get local issuer certificate

我正在使用 Node- 和 ExpressJS 构建一个 WebApp。目前我正在尝试使用 keycloak-connect 模块将我的应用程序连接到我们公司的 Keycloak。我按照不同教程中的说明配置了它并且它有效(至少大部分)。

当我连接到我的 WebApp 时,我收到了 keycloak 登录屏幕并且登录过程成功(在 keycloak 上创建了会话)。登录过程和重定向后,我收到“访问被拒绝”错误,并在日志中显示“无法获取授权代码:无法获取本地颁发者证书”。

WebApp 使用有效证书在端口 443 上运行


我用谷歌搜索了一切,并尝试了以下解决方案:

--禁用拒绝未经授权的TLS--

使用节点环境变量对未经授权的证书禁用 TLS 拒绝:

有效但不是很安全... Log.

-- 添加一个额外的CA证书--

已安装 dotenv 模块并在 .env 文件中设置以下环境变量:

通过“require('dotenv').config();”将其包含在 app.js 中,但不起作用...还尝试将其设置为带导出的系统环境变量。


它支持代理,但我还配置了 express 以信任所有具有“app.set('trust proxy', true);”的代理。


-- 版本 --

节点 - v16​​.13.1

快递 - ~4.16.1

Keycloak-connect - ^16.1.1


我在很多不同的页面上都看到过这个问题,但大多数都没有完全解决...如果能找到解决这个问题的方法就好了。

提前致谢! :)

雅尼奇

好吧,我找到了解决方案,而且效果很好!

comment GitHub 问题描述了如何从 NodeJS 使用 HTTPS 服务器发送 ca 文件。


您可以在数组中输入您的 ca 文件/包:

const trustedCa = [
    '/etc/pki/tls/certs/ca-bundle.crt',
    '/etc/pki/tls/cert.pem'
];

然后使用 fileSync 读取它们并将它们设置为 HTTPS 服务器的 globalAgent.options.ca 选项:

https.globalAgent.options.ca = [];
for (const ca of trustedCa) {
    https.globalAgent.options.ca.push(fs.readFileSync(ca));
}

这就是所有需要做的!现在我可以通过 Keycloak 登录,它成功地将我重定向到我的 WebApp,没有任何错误。

希望这对您有所帮助。

雅尼奇