2012-07-28 5 views
12

でのブラウザのサポート。私は準拠していないクライアントを別のアドレスにリダイレクトしたいと考えています。検出SNI(サーバ名の表示)私は、ブラウザのサポート<a href="http://en.wikipedia.org/wiki/Server_Name_Indication">SNI - Server Name Indication</a>かどうかを検出できるようにしたいのjavascript

私はSSLを通していくつかのコンテンツをロードすることを考えて、それが安全に転送されたことを確認しました。それ以外の場合、ブラウザはSNIをサポートしません。これはできますか?

答えて

4

あなたがSNIとフォールバックソリューション、それがホスティングしているサービス提供名の両方だものを必要とする場所に、2つのホスト名を提供し、SNIをサポートするサーバーを設定することができます。線に沿って

何か:

  • https://www.example.com/nameI'm www.example.com
  • https://www.example.net/name戻りI'm www.example.netを言う表現を返し(およびSNIを必要とします)。

https://www.example.net/nameにXHR要求を行い、www.example.comを返した場合、ブラウザはSNIをサポートしません。

+0

SNIがない場合、サーバーはwww.example.comを報告する必要があります。私が正しく思い出すと、ApacheはSNIがないときにロードした**最初の**証明書を提供します。 – Andreas

+0

はい、それは私がフォールバックの解決策を意味するものです。デフォルト値です。必要に応じて、両方に接続して得た内容を比較することができます。 – Bruno

+0

これは良いアイデアのように思えます。私はそれをテストするつもりだ、これは私のために働くだろう。 –

0

は、すべてのサイトのSNIにアップグレードcommercerack以来、私たちは同じ問題を持っていました。 (ユーザーがチェックアウトを開始し、不快なSSL問題を取得する)。

これを自由に使い始めることができます。 ブラウザのリストが増えるにつれ、私は更新しますが、今はXP + Android 2.0-2.2上のIEです。

https://github.com/brianhorakh/html-sni-useragent-sniffer-warning

+0

オンラインバグ83? if(/Android\s2\.[012]+/){browserSNICompatibility = 0; } ...正規表現を使用するには文字列varが表示されませんか? –

1

ないこれが何をしたいですが、古いブラウザはSNIを必要とするサイトを使用してみました、それは戻って、この場合には(リダイレクトされます場合は、この

RewriteEngine on 

    # Test if SNI will work and if not redirect to too old browser page 
    RewriteCond %{HTTPS} on 
    RewriteCond %{SSL:SSL_TLS_SNI} ="" 
    RewriteRule^http://www.example.com/too-old-browser [L,R=307] 

があるかどうか確認してくださいhttpとブラウザが古すぎると言っているページ)。しかし、あなたはいつもエラーになるでしょう。それは避けることはできません。ブラウザはこんにちはIPと言う...、そして、Apacheの返信helloはここで私の証明書です。ブラウザがhello apacheでSNIを供給しない場合、デフォルトの(つまり間違った)証明書が送信されます。ブラウザはそれから不平を言う。

あなたは、あなたがhtaccessファイルに次のように

#Set $_SERVER['SSL_TLS_SNI'] for php = %{SSL:SSL_TLS_SNI} or value 
    SetEnv SSL_TLS_SNI %{SSL:SSL_TLS_SNI} 

を何かを置くことができそして、自分のページにブラウザようhttpsのデフォルトのドメインからのフェッチ(デフォルトを行うhttpsにスワップする前に、HTTPからこれをピックアップする場合セキュリティ上のエラーがあるとは言いません)。 SNIが動作している場合、php $ _SERVER ['SSL_TLS_SNI']はドメイン名を持ちます。それ以外の場合は%{SSL:SSL_TLS_SNI}になります。このコードを改善することはできますが、あなたはそのアイデアを得ることができます。

+0

SSLハンドシェイクに失敗した場合、ブラウザがリダイレクトを見ないと思うので、 'SSL_TLS_SNI'変数に基づいたリダイレクトは機能しません。 –

1

は、あなたはそれを必要とするSNIサポートをテストすることができます。つまり、SNI HTTPSにユーザーを強制して、サポートしていない場合はフォールバックすることはできません.Windows XPのChromeからこのようなエラーが表示され、処理が進まないためです。

だから、(残念ながら)利用者は、実際には安全でないHTTP接続を介して開始し、その後、彼らはSNIをサポートしている場合にのみアップグレードすることがあります。あなたの目的地SNI HTTPSサーバから<script>をロードし、あなたのプレーンなHTTPページから

  1. リモートスクリプト
    、スクリプトのロードとは、正しく実行されている場合、あなたが知っている:

    あなたは経由SNIのサポートを検出することができますブラウザはSNIをサポートします。

  2. クロスドメインAJAX(CORS)オプション1と同様に
    、あなたはHTTPSにHTTPページからクロスドメインAJAX要求を実行しようとしますが、CORSがonly limited browser supportを持っていることに注意してください可能性があります。

  3. スニフユーザーエージェント
    これはおそらく、最も信頼性の高い方法であり、あなたがブラウザ(およびオペレーティングシステム)のブラックリストを持つの間で決定する必要がありますそれをサポートしないことが知られている、または既知のホワイトリストそうするシステム。

    IEのすべてのバージョン、Chrome &、Windows XP以降のOperaはSNIをサポートしていません。 CanIUse.com for full list of supported browsersを参照してください。

関連する問題