web-dev-qa-db-ja.com

AJAX信頼できない(自己署名)HTTPSへの呼び出しがサイレントで失敗する

自己署名証明書を使用する安全なサーバーにAJAXを呼び出したいのですが。アプリが使用されている環境では問題ありません。ユーザーにCA証明書を提供し、アプリを使用する前にインストールしてもらうことができます。ただし、場合によっては、ユーザーが証明書をインストールする前にアプリにアクセスしようとします。これらの場合、アプリは黙って失敗します-少なくともFirefox(問題の最も一般的なケース)では、エラーハンドラーを起動することなく、呼び出しが黙って終了しているように見えます。 FWIW、ユーザーがサーバー上の実際のページにアクセスすると、証明書の警告が表示されます。

私は回避策でハックすることができます-たとえば、ハートビート/ ping要求を行い、サーバーが時間内に応答するかどうかを確認するためにウォッチドッグタイマーを設定します-しかし、それはまあ、ハックのようです。事前に接続をテストできるようにしたいと思います。話したいサーバーにJavascriptからの信頼できる証明書があることを確認する「正しい」方法は何ですか?違いがある場合は、JQueryを介してAJAXリクエストを実行しています。

更新:ここに素晴らしいパンチラインがあります。結局のところ、AJAXはまったく問題ではありませんでした。私はそれが自己署名証明書に関連しているという症状に基づいて確信していたが、AJAXエラーの欠如は不安でした。以下の回答でリンクされている仕様を考えると。別のチームメンバーがそれを釘付けにしました:AJAXエラーハンドラーはJQueryがロードされなかった!私たちのサイトの別のサブドメインからのJQueryも含めており、これもHTTPSでホストされていました。ユーザーは、ourService.example.comに例外を追加しましたが、js.example.comには追加しませんでした。どうやら<script>タグを信頼されていない安全な接続に向けると、thatも警告なしに失敗します。

{/ headdesk}

23
Coderer

XMLHttpRequests(AJAX要求)は、同じオリジンサーバーでのみ許可されます。つまり、ターゲットURLのscheme:// Host:portの部分は、現在のドキュメントの部分と一致する必要があります。仕様によると、SSL以外のURLからSSL URLでリクエストを行うことも許可されるべきではありません。

私が目にするハックの少ないソリューションは、すべてのユーザーをSSLサイトに強制的にリダイレクトするというものです。これにより、AJAX要求を行う前に、証明書の警告が表示されるように強制されます。

注:仕様には、TLSハンドシェイクが失敗した場合(ある意味、この場合に該当すると想定)、NETWORK_ERR(コード19)例外がスローされることも記載されています。 AJAXリクエストを開始するときに例外をキャッチしようとする可能性があります。詳細については、エラー処理の the spec を参照してください。

16
Seldaek