应用程序能否通过系统范围的nodejs环境变量?"/>
基于电子的应用程序能否通过系统范围的nodejs环境变量?
我是否以为基于电子的应用程序将传递NodeJS环境变量是错误的?
我们正在处理的应用程序基于Electron 3.1.x构建。电子3.1.x的环境变量列表似乎起作用。但是,如果我尝试使用NodeJS中列出的environment variables中的任何一个(特别是NODE_EXTRA_CA_CERTS
或NODE_TLS_REJECT_UNAUTHORIZED
),它们似乎都无效。我的印象是,由于Electron只是一个nodejs应用程序,因此它将遵循相同的环境变量。
是,不是。当然,环境变量可用于应用程序代码(process.env
),电子本身也支持某些(but not all)NODE_*
变量。
重要的是要记住,电子是节点,而铬是用螺栓固定在一起的。与HTTP请求特别相关,这意味着电子实际上具有两个并行的HTTP实现:浏览器(fetch
/ XHR)和节点的(require('http')
)。
因此,如果HTTP请求通过浏览器管道,则NODE_*
变量无效,反之,通过节点管道发出的请求不受Chrome flags的影响。
还有其他怪癖:
- 默认情况下,Chrome将使用系统的HTTP代理设置;节点不
- 默认情况下,Chrome将使用系统的根CA证书存储;节点使用内置列表
- 通过浏览器管道发出的请求在电子开发工具的“网络”标签中可见;节点请求不是
所以:
- 要在各处忽略TLS证书错误,必须在main.js的开始处设置
NODE_TLS_REJECT_UNAUTHORIZED=0
和,请调用appmandLine.appendSwitch('ignore-certificate-errors')
。当然,出于明显的原因,全面禁用证书错误是很危险的。 - 为了使浏览器管道信任自签名证书,应将其添加到系统的CA存储(Windows certmgr,OS X钥匙串,Linux NSS)。
不幸的是,
NODE_EXTRA_CA_CERTS
在电子中为broken,因此很难使节点管道信任自签名证书。 This comment建议使用猴子补丁NativeSecureContext.prototype.addRootCerts
解决此问题。您也可以尝试猴子修补https.globalAgent
。无论哪种方式,我都不相信有一种方法可以在不修改应用程序代码的情况下获得受信任的证书。
您可能需要修改应用程序JS才能正常工作。如果您使用的是分布式应用程序,则可能会感兴趣asar extract
。
更多推荐
基于电子的应用程序能否通过系统范围的nodejs环境变量?
发布评论