【问题标题】:Will an Electron based app pass system wide nodejs environment variables?基于 Electron 的应用程序会传递系统范围的 nodejs 环境变量吗?
【发布时间】:2020-02-25 04:26:34
【问题描述】:

我认为基于 Electron 的应用程序将传递 NodeJS 环境变量是错误的吗?

我们正在处理的应用程序是基于 Electron 3.1.x 构建的。电子3.1.x 的环境变量列表似乎有效。但是,如果我尝试使用 NodeJS 中列出的任何 environment variables(尤其是 NODE_EXTRA_CA_CERTSNODE_TLS_REJECT_UNAUTHORIZED),它们似乎都不起作用。我的印象是,由于 Electron 只是一个 nodejs 应用程序,它会尊重相同的环境变量。

【问题讨论】:

    标签: node.js electron


    【解决方案1】:

    是和不是。环境变量当然可用于应用程序代码 (process.env),而电子本身也支持一些 (but not all) NODE_* 变量。

    重要的是要记住,electron 是 node 和 Chrome 螺栓连接在一起的。与 HTTP 请求特别相关,这意味着 Electron 实际上有两个并行的 HTTP 实现:浏览器 (fetch/XHR) 和节点 (require('http'))。

    因此,如果 HTTP 请求通过浏览器管道,NODE_* 变量无效,相反,通过节点管道发出的请求不受 Chrome flags 影响。

    还有一些额外的怪癖:

    • 默认情况下,Chrome 会使用系统的 HTTP 代理设置;节点没有
    • 默认情况下,Chrome 会使用系统的根 CA 证书存储;节点使用内置列表
    • 通过浏览器管道发出的请求在电子开发工具的网络选项卡中可见;节点请求不是

    所以:

    • 要忽略任何地方的 TLS 证书错误,您必须在 main.js 的最开始设置NODE_TLS_REJECT_UNAUTHORIZED=0 ,调用app.commandLine.appendSwitch('ignore-certificate-errors')。当然,出于显而易见的原因,全面禁用证书错误是很危险的。
    • 要让浏览器管道信任自签名证书,您应该将其添加到系统的 CA 存储区(Windows certmgr、OS X Keychain、Linux NSS)。
    • 不幸的是,NODE_EXTRA_CA_CERTS 在电子中是 broken,因此很难让节点管道信任自签名证书。 This comment 建议猴子修补 NativeSecureContext.prototype.addRootCerts 以解决此问题。你也可以试试猴子补丁https.globalAgent

      无论哪种方式,我都不相信有办法在不修改应用代码的情况下获得受信任的证书。

    您可能需要修改应用 JS 才能使其正常工作。如果您正在处理分布式应用程序,asar extract 可能会感兴趣。

    【讨论】:

    • 我主要感兴趣的是让应用程序在不引发证书错误的情况下加载。浏览器工作正常,因为证书已经在系统 CA 存储中。你在 Electron 中提到的带有 NODE_EXTRA_CA_CERTS 的问题是促使我发布这个问题的原因,因为post 声明电动汽车工作并且票已关闭,所以我认为我只是做错了什么。根据您列出的选项,似乎唯一的选择是请求将其添加到应用程序中(我不是在写)。感谢回复
    • 正确而详细的答案。谢谢@josh3736!
    猜你喜欢
    • 2019-12-15
    • 2019-07-22
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多