web-dev-qa-db-ja.com

SNIは実際にブラウザで使用され、サポートされていますか?

SNIに関するさまざまな情報を見つけることができます( Wikipedia を参照)が、ブラウザーでの実際のサポートに関する統計は見つかりません。

私が見つけた最高のことは、Windows XP SP3で動作するはずです。

SNIが実際に実際に使用できるかどうかは誰にもわかりませんか?

66

仮想ホスティング環境(サーバーごとに複数のドメイン)の証明書ごとに1つのIPから、すべてのドメインに1つのIPを持つ負荷分散環境に切り替えるための経験とアプローチを共有できます。

アナリティクス(1か月あたり100万人以上のユニークビジター)を調べました。ほとんどの場合、北米の男性ユーザーが自動車部品をオンラインで購入しようとしており、2014年3月8日にユーザーの約4%がWindows XP Internet Explorerを使用(その他はマイナーでした-最悪の場合、総ユーザーの4.5%がSNIをサポートしないことにより影響を受けます)。この割合は、少なくとも米国ではかなり急速に低下しています。

最初に、SNI以外のお客様がSNIをサポートしているお客様とは多少異なる体験をすることは「OK」であると判断しました。

私たちのアプローチは、ブラウザ側とオペレーティングシステムの組み合わせがSNIをサポートしていないサーバー側(UA文字列を使用)を検出することでした(他の人々が述べたように: SNIサポートに関するウィキペディアの記事 )。すべてのドメイン(〜120)には、単一の負荷分散IPを指すAレコードがあります。 generic-autoparts.comを呼び出すことができるドメインの2番目のIP(負荷分散)がありました。

したがって、セットアップは[以下の例として使用するドメインに関連付けられていません]です。

mikesautoparts.com-> IP Xのネームサーバーレコード
dansautoparts.com-> IP Xのネームサーバーレコード
jensautoparts.com-> IP Xのネームサーバーレコード
...など

generic-autoparts.com-> IP Yのネームサーバーレコード

お客様が http://www.dansautoparts.com をヒットし、SNIをサポートしている場合、何も起こりません。彼はdansautoparts.comを閲覧し、チェックアウトするときが来たら https://www.dansautoparts.com を使用します。

顧客が http://www.dansautoparts.com をヒットし、SNIをサポートしていないことが検出された場合、すぐに顧客を http://generic-autoparts.comにリダイレクトします。 /dansautoparts.com 。彼はそこで買い物をし、チェックアウト時に https://generic-autoparts.com/dansautoparts.com を使用します。

これで、顧客が https://www.dansautoparts.com DIRECTLY(電子メールのリンク、検索エンジンのインデックス付きページ)をヒットした場合、運が悪くなります。彼らは厄介な証明書エラーを取得します。私たちのケースでは、システムが送信したすべての電子メールがhttpsを使用しないようにし、検索エンジンがhttpsページのインデックスを作成していないことを確認しました。

各環境には、さまざまな課題と潜在的なトレードオフがあります。私たちのケースではこれがうまく機能し、顧客が http://generic-autoparts.com/ [ORIGINAL DOMAIN] .comにリダイレクトされることを「受け入れる」(または気付かない)ことがわかりました。また、generic-autoparts.comを介してチェックアウトを安全に保ちました。

非SNIユーザーの20%がリダイレクトに気づいたとしましょう。それは怪しいようで、彼らは去ります。私たちの場合、それは0.8-0.9%(2014年3月8日の数値に基づいて)のユーザーであり、私たちはそれで「生きる」ことをいとわなかった。現在、これに関する具体的なデータはありませんが、全体的な売上は安定しています。 [編集3/28/2014:顧客を100%切り替えた後、売上に影響はありませんでした]

実装更新2014年7月8日

サーバー上のすべてのUAエージェント文字列を静的に検出することは不可能であることがわかりました。ブラウザのSNI機能を検出するために、次のJavaScriptを実装しました。一般的なアプローチは、SNIを必要とするドメインに対してJSONPリクエストを行うことです(Apacheは「SSLStrictSNIVHostCheck on」でこれをサポートします)。 JSONP要求がタイムアウトして失敗した場合、お客様をnonSNIドメインにリダイレクトします。

さらに問題を複雑にするために、SNI_TEST_DOMAINがダウンしているという理由だけで全員をリダイレクトしたくありません。 JSONPリクエストが失敗した場合(JSONPの失敗を直接検出する方法がないためタイムアウトになる)、HTTPの「ヘルスチェック」リクエストを実行してサーバーが利用可能であることを確認します。さらに、ページの読み込みごとにこのjavascriptコードを実行する必要はありません。これにより、奇妙なタイムアウトが発生し、多くの顧客が誤ってリダイレクトされる可能性が高くなるため、SNIチェックが完了したらセッション変数を設定して、発生しないようにします顧客がサイトをナビゲートするときに再び。

JSONPタイムアウトが信頼できないために失敗する特定の偽チェックを取得することはわかっていますが、これを実装してからお客様からの苦情はありません。

var redirect='http://REPLACE_WITH_NON_SNI_URL';

var sni_https_timeout, sni_http_timeout;
var https_req = $.ajax({
    url : 'https://SNI_TEST_DOMAIN.com/snitest.php',
    dataType : "jsonp",
}).done(function() {
        window.clearTimeout(sni_https_timeout);
        var request = $.ajax({
        url: "index.php?ua=sni_check_done",
       type: "POST"
    });
})

sni_https_timeout = window.setTimeout(function() {
    var http_req = $.ajax({
        url : 'http://SNI_TEST_DOMAIN/sni_healthcheck.php',
        dataType : "jsonp"
    }).done(function()
        {
            window.clearTimeout(sni_http_timeout);
            window.setTimeout(function()
            {
                window.location = redirect;
            },
        200);
    });

    sni_http_timeout = window.setTimeout(function() { sni_http_fail(); }, 8000);

}, 8000);

function sni_http_fail() {
    var request = $.ajax({
        url: "index.php?ua=sni_check_done",
        type: "POST"
    });
}

snitest.php/sni_healthcheck.php:

<?php
if (array_key_exists('callback', $_GET))
{
    header( 'Content-type: application/javascript' );
    echo "{$_GET['callback']}();\n";
}
90
ronneseth

参照したウィキペディアの記事 は、サポートされているブラウザーとサーバーのバージョンをリストします。たとえば、Internet Explorer 7(XPではなくVista以上)以降およびMozilla Firefox 2.0。すべての訪問者がサポートされているブラウザーを使用していることがわかっていない限り、SNI(1つのIPアドレスで複数の証明書を使用)をサイトのSSL部分から切り離さずに使用することはできません。

19
Robert

問題は、windows XP clients and Android <3.0 client。残念ながら、それらはまだ多くの当社ウェブサイトへの訪問者のほぼ10%です。 XP、Blackberry、Gingerbreadを組み合わせることで、現時点ではほとんどのWebサイトでSNIが受け入れられなくなります(2015年2月)。 。

2016年11月の更新(21か月後):毎月最大10,000回の訪問でかなり標準的なサイトに移動します。 2013年1月〜10%非SNI。 2014年1月〜6%、2015年1月<2%、2016年1月〜0.5%、2016年11月〜0.1%(1,000人に1人)。 2015年11月/ 12月にカットオーバーを行いました。ただし、特定の市場では、これらのユーザーの数が多くなる可能性があります。 Google Analyticsでカスタムオーディエンスを作成したため、影響を簡単に確認できます。 OS名で定義するだけで、バージョンはで始まり、XPの場合、ブラウザはIEです。

9
jeffmcneill

Windows上のInternet Explorer(すべてのバージョン、6、7、および8)XPはSNIをサポートしません。他のすべては機能します。XP Internet Explorerを使用しますが、これはSNIを使用できないユーザーの魔法の数です。

モバイルサポート:

Android default browser on Honeycomb or newer      
Windows Phone 7
MobileSafari in Apple iOS 4.0 or later
5
themihai

はい

SNIでXPからのSSL接続をサポートできません。ただし、XPクライアントが接続できるようにすることは、とにかくいくつかの標準に準拠しないため、他の理由でこれらのユーザーを削除する必要がある場合があります。

彼らは2016年にわずか数パーセントであり、減少しています。 SSLでevery userをサポートする必要がある場合は、動的に切り替える必要がありますが、大部分が必要な場合は...確認してください。

3
DigitalRoss

私はこれに答えるのが遅れていますが、この種のソリューションに興味があるかもしれないすべての読者のために。サーバー側の機能を使用してブラウザーとOSを検出し、「ChromeまたはFirefoxなどのオンラインショッピングに安全なブラウザーをインストールして使用し、ダウンロードとインストールのリンクを提供します。」

これは、顧客のショッピングを安全にする最良の方法であり、2つの目的に役立ちます。1つは、SNIがSSLを使用できるようにすることと、顧客の「ショッピングを安全にする」ことです。 XP上の古いブラウザは、SNIが有効なSSLを使用しているかどうかに関係なく、本当に安全ではありません。

これは、古いIEバージョンでXPを使用しているユーザーの割合が米国では5%未満であり、他の国では無視できるかゼロであるためです。実際、他の国の人々はオープンソースブラウザに慣れています。

私自身の経験では、私は多くのウェブサイトをホストするだけでなく、多くのクライアントをホストしており、専用IPなしでSNIテクノロジーを使用してすべてのサイトでSSLを使用しており、人々はchromeまたは多くの国、ほとんどすべての国、そして米国では95%のFirefox。

不正確な情報はご容赦ください。

2
LuckyBabu

http://caniuse.com/#feat=sni は、現在SNIが97.6%のブラウザーでサポートされていると言います。

1
Bryan Legend

これには、UIと検出部分の2つの側面があると思います。

[〜#〜] ux [〜#〜]

<!--[if lt IE 7]>
   <div>You're using a browser that has high security risks (SSL, XSS, etc). Please consider upgrading it.</div>
<![endif]-->

IE6 or belowを使用している人は誰でもWindows XPにいる可能性が高く、SNIをサポートしていないことは明らかです。ユーザーエージェントを偽装する他の人はここでは関係ありません。

サーバー側

  1. ユーザーエージェントのスニッフィング。単体テストが完了した後、正規表現を思い付きます。
  2. 上記のAJAX実装を使用します。

特記事項

AJAXソリューションを使用すると、99%の防弾検出が得られますが、いくつかのWeb開発の原則に準拠していません。

  • プログレッシブエンハンスメント-すべてのユーザーに同じAJAXリクエストを与えています。 SNIをサポートするユーザーは気にしないでください。
  • Legacy-このコードを簡単に廃止することはできません。
  • AJAXリクエストでjQueryを使用している場合、$。ajaxStop()メソッドに依存するコードに影響を与える可能性があります。
0
Șerban Ghiță