HTTP接続をSSL / TLSにアップグレードする


8

現在、すべてのHTTPリクエストを同等のHTTPSサイトに自動的にリダイレクトするサーバーがあります。問題は、一部のブラウザーがSSL証明書(StartSSL.com)を受け入れないか、SNIをサポートしていないため、証明書の警告が表示され、ユーザーがWebサイトを閲覧し続けることができないことです。

ブラウザにプレーンHTTPではなくHTTPSを使用させようとするメカニズムはありますか?それが機能しない場合(証明書が受け入れられない、SNIがサポートされていないなど)は、HTTPを使用し続けます。

現在、Apache 2.4と複数の仮想ホストを使用していますRedirect / https://domain.example/。これらのホストはすべて、HTTP接続をでリダイレクトします。


3
証明書が正しくない場合のHTTPSからHTTPへの変更は、訪問者として発生したくないものです。証明書が正しくないという事実は、何かが間違っている兆候であるはずです。暗号化されていない接続に戻すことは、そのときあなたができる最悪のことです。最善の解決策は、証明書を修正して、別のCAを使用するか、SNIを使用せずに、ホスト名と一致するようにすることです。
Teun Vink 14年

はい、わかった。しかし、HTTPS接続をサポートしていないか、サーバーから提供された暗号化メカニズムをサポートしていないブラウザーが存在すると予想される場合。次に、そのクライアントには(私の場合)、サイトを使用する可能性がありません。これは、HTTPSに相当するサイトに自動的にリダイレクトするためです。
foxylion 2014年

今日の世界では、この制限を克服することはかなり可能です。非常に主要なサイトでは、SSLのみに切り替えています。彼らがそれを行うことができれば、あなたはそれを行うことができます。
MichelZ 2014

回答:


15

httpsが機能しない場合は、ブラウザ自体がhttpにダウングレードしないようにする必要があります。攻撃者が実行する必要があるのは、httpsを使用不可にすることだけです(たとえば、ポート443をブロックする)。そのため、これを行うことができる唯一の方法は、たとえばhttpリダイレクトを送信するなど、サーバーからブラウザに指示することです。もちろん、これは安全な接続を介して送信する必要があります(そうしないと、中間者がそれを偽造する可能性があります)が、残念ながら、安全な接続が失敗するのはまさにあなたの問題です。

要約すると、いいえ、それは不可能であり、この方法の方が優れています。

ところで、最新のブラウザはすべてSNIをサポートしていますが、すべてのアプリケーション(Javaアプリケーションなど)がサポートしているわけではありません。Webサーバーに複数のドメインがあり、これらのアプリで必要なドメインが1つだけの場合、このドメインの証明書をデフォルトとして設定できます。それ以外の場合は、必要なすべてのドメインをサブジェクトの別名として含む(より高価な)証明書を取得する必要があります。

別のアイデアで編集:あなたがしようとすることができることは、httpsとしてあなたの側から画像をダウンロードし、img-tagのonerrorハンドラーで成功を確認することです。たぶん、これはユーザーに表示される警告をトリガーしませんが、ロードに失敗するだけです。そして、それが成功すれば、httpsアクセスが可能であることがわかり、ユーザーをリダイレクトします。

それとは別に、httpでのアクセスも受け入れる場合は、なぜhttpsを提供するのかを自問する必要があります。保護すべきデータがあるか、そうでないかです。httpへのフォールバックを提供する限り、攻撃者がhttpsではなくhttpを強制するのは簡単です。


1
非常によく述べた。
Tim Brigham 2014年

3

まず第一に、SNIサポートのないすべてのクライアントに使用する証明書を1つ指定できるようにする必要があります。これは、そのIPアドレスでホストされているすべてのドメインを意味します。SNIを使用せずに少なくとも1つのドメインをクライアントで機能させることができます。

次に、httpからhttpsにリダイレクトするときにできることは、2段階のリダイレクトです。httpからhttpsへの最初のリダイレクトはドメイン名を使用します。これは、SNIサポートの有無にかかわらず動作することを確認したものです。このhttpsサイトから後で適切なURLにリダイレクトできるように、完全な元のURLを含める必要があります。

SNIの有無にかかわらず機能するドメイン名は、SNIがクライアントによってサポートされているかどうかによって異なる動作をする場合があります。これにより、SNIを必要とするドメインにリダイレクトする前に、クライアントがSNIをサポートしていることがわかります。

Apacheでこれを正確に構成する方法は、私の側から少し推測されます(複数の証明書でApacheを構成したことがないため)。それを行う方法は、中間ドメインを含むすべてのドメインの名前ベースの仮想ホストを作成することだと思います。

次に、SNIを使用しないクライアント用のデフォルトの仮想ホストを作成します。これは、名前を使用するものと同じ証明書を使用します。同じ証明書を持つ2つの仮想ホストは、SNIをサポートしているかどうかに応じて、クライアントに異なるリダイレクトを送信します。

最後に、サーバーでIPv6を有効にします。IPv6を使用すると、各仮想ホストに1つを割り当てることができる十分なIPアドレスを取得できます。同じ仮想ホストのセットにIPv4に基づく名前とIPv6に基づくIPを付けることができるため、この方法で構成を複製する必要はありません。

最終結果は、クライアントがSNIまたはIPv6のいずれかをサポートしている限り機能するセットアップになります。この場合、どちらもサポートしていないクライアントだけが問題を抱えますが、それらを検出して、別のリダイレクトまたはエラーメッセージをサーバーで処理することができます。

CAを好まないクライアントについては、私の唯一の提案は、ユーザーエージェントによってクライアントを認識し、適切と思われる方法で処理することです。httpsサイトへのリンクがあることを確認してください。誤って多数のクライアントを含めた場合に備えて、それらのリンクをクリックできます。


0

ちょうど大雑把な推測:StartSSLに必要なsub.class1.server.ca.pemファイルを含むApache 構成にSSLCertificateChainFileディレクティブがないのでしょうか?


いいえ、すべて正常に動作しますが、一部の古いブラウザはSNIをサポートしていないか、StartSSL.comを信頼していません。問題は、これらの訪問者が証明書の警告を無視せずにページを表示する可能性がないことです(解決策はありません)。
foxylion 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.