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

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

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

私が調べた限りでは、SP3 を適用した Windows XP でも動作するはずです。

SNI が実際に使用できるかどうか知っている人はいますか?

ベストアンサー1

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

弊社の Analytics (月間 100 万以上のユニーク ビジター) を調べたところ、そのほとんどが自動車部品をオンラインで購入しようとしている北米の男性ユーザーでした。2014 年 3 月 8 日時点で、約 4 % のユーザーが Windows XP で Internet Explorer を使用していました (その他のユーザーは少数で、最悪の場合、SNI をサポートしていないことで全ユーザーの 4.5 % が影響を受けることになります)。これらのユーザーを「制御」できないため、ブラウザーを切り替えるように指示することはできないことに注意してください。この割合も、少なくとも米国では急速に減少しています。

まず、SNI をサポートしていない顧客が SNI をサポートしている顧客と多少異なるエクスペリエンスを得ても大丈夫だと判断しました。

私たちのアプローチは、どのブラウザ/オペレーティングシステムの組み合わせが SNI をサポートしていないかをサーバー側で(UA 文字列を使用して)検出することでした(他の人が言及したように:SNI サポートに関する Wikipedia の記事)。すべてのドメイン (約 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 のネームサーバーレコード

顧客がダンズオートパーツ、SNIをサポートしているので、何も起こりません。dansautoparts.comを閲覧し、チェックアウトの時になると、https://www.dansautoparts.com

顧客がダンズオートパーツ、SNIをサポートしていないことがわかったら、すぐにお客様を出典:http://generic-autoparts.com/dansautoparts.com彼はそこで買い物をし、チェックアウトの時に詳細はこちら

さて、顧客がhttps://www.dansautoparts.com直接 (電子メール内のリンク、検索エンジンのインデックス ページ) では、運が悪いです。厄介な証明書エラーが発生します。当社の場合、システムが送信するすべての電子メールが https を使用していないことを確認しており、検索エンジンが当社の https ページをインデックスしていないこともわかっていました。

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

非 SNI ユーザーの 20 % がリダイレクトに気づき、怪しいと感じて離脱したとします。当社の場合、これはユーザーの 0.8 - 0.9 % (2014 年 3 月 8 日の数字に基づく) であり、当社はそれを「受け入れる」つもりでした。現時点ではこれに関する具体的なデータはありませんが、全体的な売上は安定しています。[編集 2014 年 3 月 28 日: 顧客の 100 % を切り替えた後、売上に影響はありませんでした]

実装アップデート 2014 年 7 月 8 日

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

さらに問題を複雑にしているのは、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";
}

おすすめ記事