Electron の Chromium がフェッチ リクエストで HTTPS を強制しないようにするにはどうすればよいですか?

okwaves2024-01-25  11

Electron レンダラーから、コンピューター上の Django インスタンスによって提供されるローカル GraphQL エンドポイントにアクセスしています。これは、HTTPS ではなく HTTP 経由で実行したいと考えています。しかし、Electron の Chromium は私のフェッチ リクエストをインターセプトし、先制して 307 リダイレクトを返しているようです。

つまり、フェッチリクエストが http://local.myapp.com:3000/v1/graphql への POST である場合、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', )

また、フェッチ オプションに {redirect: 'manual'} と {redirect: 'error'} を含めるように設定してみました。リダイレクトを防ぐことはできますが、データを取得するにはエンドポイントへのリクエストを成功させる必要があるため、役に立ちません。

ネイティブフェッチをエレクトロフェッチ (リンク) とクロスフェッチ (リンク) に置き換えてみました。) しかし、どちらを交換しても動作に変化はないようです。

編集: また、まったく同じヘッダーと本文情報を使用して Electron の外部で GraphQL にリクエストを行うと、正常に動作します (Insomnia 経由)。

それでは、いくつか質問があります:

Electron 内の Chromium によって使用されている HSTS ドメインのリストをプログラムで表示/クリアする方法はありますか?

私がやろうとしていることを達成するためのより良い方法はありますか?

1

良い解決策がなかったため、loca の使用に切り替えました。問題を完全に回避するには、カスタム ローカル ドメインの代わりに lhost を使用します。理想的ではありませんが、これはおそらく多くの人が遭遇する特殊なケースであるため、問題や機能リクエストをオープンする価値はおそらくないことは理解しています。

– カクスライン

2020 年 9 月 6 日 18:19



------------------------

問題はサーバーにあるのではないかと思います。ほとんどのサーバーはいかなる方法でも HTTP を許可しておらず、データ転送を中止して HTTPS にリダイレクトします。なぜなら、そうする明確な理由があります。

誰かが https:// を http に変更したばかりで、HTTPS 経由で接続してデータの代わりに API を送信するアプリがあると想像してください。// これは、データが暗号化されずに送信され、API キーをどのように操作しても公開されることを意味します。そのため、サーバーは HTTP リクエストを一切許可せず、HTTP リクエストさえも受け入れません。単一ビットのデータ。

解決策は 2 つ考えられます。

Chromium がリダイレクトの理由ではありません。Django インスタンスは運用環境として、または HTTPS リスナーを使用して構成されている可能性があります。 Nginx がリダイレクトを実行している可能性があります (構成に少しの SSL 定義が含まれています)。 最後になりましたが、OpenSSL を使用して証明書を生成します (ホスト http://local.myapp.com:3000/ 上)。注: ポートを含めて、それを Django インスタンスで使用してください。証明書を信頼できるので、コンピュータ上のどこでも機能します。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。