微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何防止Electron's Chromium在获取请求时强制使用HTTPS?

如何解决如何防止Electron's Chromium在获取请求时强制使用HTTPS?

我要从Electron渲染器访问计算机上Django实例提供的本地GraphQL终结点,我想通过HTTP而不是HTTPS来实现。但是Electron的Chromium似乎拦截了我的fetch请求,并抢先返回了307重定向

因此,如果我的fetch请求是POSThttp://local.myapp.com:3000/v1/graphql,那么Chromium返回一个307并强制重定向https://local.myapp.com:3000/v1/graphql,这由于我的服务器而失败正在侦听端口3000,对于我的用例,我无法为local.myapp.com做本地证书。

理论上,第一个不安全请求应该是在没有任何SSL要求的情况下,在监听端口3000的Nginx Docker容器中命中。 Nginx正在将请求代理到Hasura容器。但是我什至没有在Nginx访问日志中看到请求,因此我很确定Chromium会拦截该请求。

我相信StackOverflow的注释很好地总结了这种情况的发生原因:https://stackoverflow.com/a/34213531

尽管我不记得曾经从我的GraphQL端点或Django服务器返回一个Strict-Transport-Security头。

我尝试以下代码未能成功关闭我的Electron应用程序中的Chromium行为:

import { app,} from 'electron'

app.commandLine.appendSwitch('ignore-certificate-errors',)
app.commandLine.appendSwitch('allow-insecure-localhost',)
app.commandLine.appendSwitch('ignore-urlfetcher-cert-requests',)
app.commandLine.appendSwitch('allow-running-insecure-content',)

我还尝试将fetch选项设置为包括{redirect: 'manual'}{redirect: 'error'}。我可以防止重定向,但这对我没有任何好处,因为我需要向端点发出成功的请求才能获取数据。

我尝试用fetchlink)和electron-fetchlink)替换原生cross-fetch,但是当我的行为似乎没有变化换掉其中任何一个

编辑:另外,使用完全相同的标头和正文信息向我在Electron之外的GraphQL发出请求,效果很好(通过Insomnia)。

所以我有几个问题:

  1. 是否可以通过编程方式查看/清除电子中铬所使用的HSTS域列表?

  2. 是否有更好的方法来完成我想做的事情?

解决方法

我认为问题可能出在服务器上,大多数服务器都不允许以任何可能的方式使用 HTTP,他们会放弃数据传输并将您重定向到 HTTPS,而且他们这样做的原因很明确。

>

假设您有一个应用程序通过 HTTPS 连接以发送您的 API 以换取一些数据,如果有人只是将 https:// 更改为 http:// 这意味着数据将在未加密的情况下发送并且没有无论你用 API 密钥做什么,它都会被暴露,这就是为什么服务器不允许任何 HTTP 请求,它们甚至不接受一点数据。

我可以想到两种解决方案。

  • Chromium 不是重定向的原因,我们的 Django 实例可能配置为生产或使用 HTTPS 侦听器。
  • Nginx 可能是进行重定向的人(在配置上有一点 SSL 定义)
  • 最后但并非最不重要的一点,只需使用 OpenSSL 生成证书(在主机 http://local.myapp.com:3000/ 上)注意:包括端口并在您的 Django 实例上使用它。您可以信任该证书,以便它可以在您计算机上的任何地方使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。