このトピックでは、関連するwebサービスがWeb Application Firewall (WAF) に追加された後に、クライアント間のサーバー名表示 (SNI) 互換性の問題によって引き起こされるHTTPSアクセス例外を解決する方法について説明します。
背景
IPアドレス不足の課題に対処するために、仮想ホスティングが導入されました。 仮想ホスティングでは、単一のHTTPまたはHTTPSサーバーで、同じIPアドレスを共有することで複数のドメイン名をホストできます。 この場合、各ドメイン名は仮想ホストとして機能します。 サーバーは割り当てることができます は、クライアント要求で運ばれるホストヘッダに基づいて、異なる仮想ホストに要求します。 たとえば、仮想ホスティングが有効になっているwebサーバーでホストされているHTTPS webサイトにブラウザーがアクセスできるようになる前に、ブラウザーはサーバーとのSSL接続を確立し、必要なサーバー証明書を要求する必要があります。 ただし、サーバーはアクセスされたドメイン名を特定できず、必要な証明書を返すことはできません。
SNIは、この問題を解決するために設計されたSSL/TLS拡張です。 サーバーとのSSL接続が確立される前に、ブラウザーはサーバーにアクセスするドメイン名を指定するホスト名を送信します。 次に、サーバーはドメイン名の証明書を識別して返します。
ほとんどのオペレーティングシステムとブラウザはSNIをサポートしています。 OpenSSL 0.9.8は組み込みSNIをサポートします。 NGINXサーバーの新しいバージョンもSNIをサポートしています。
問題の説明
WebサイトがWAFに追加された後にWebサイトでHTTPSアクセス例外が発生した場合、関連するクライアントがSNIをサポートしない可能性があります。
SNIをサポートしていないブラウザーを使用してWAFで保護されたWebサイトにアクセスする場合、WAFは要求された特定のドメイン名を特定できず、ブラウザーと対話するためにドメイン名に必要な証明書を取得できません。 この場合、WAFはデフォルトの証明書を使用してブラウザとのハンドシェイクプロセスを完了し、ブラウザは「証明書」を報告します。not trusted "エラー。
クライアントがSNIをサポートしていない場合、次の問題が発生する可能性があります。
クライアントがiOSで実行されるモバイルアプリの場合、アクセスは成功です。 クライアントがAndroid上で実行されるモバイルアプリである場合、アクセスは失敗します。
クライアントがブラウザの場合、「Certificate not trusted」エラーが報告されます。
解決策
クライアント側でSSLハンドシェークパケットをキャプチャして、クライアントがSNIをサポートしているかどうかを判断します。 この例では、Chromeブラウザを使用してAlibaba Cloudの公式Webサイトにアクセスします。
SNI情報がClient Helloパケットに含まれている場合、クライアントはSNIをサポートします。
それ以外の場合、クライアントはSNIをサポートしません。 推奨されるプロダクト :
ブラウザをアップグレードするか、ChromeやFirefoxなどの最新バージョンのブラウザを使用します。
WeChatやAlipayコールバックなどのサードパーティのコールバックシナリオでは、配信元サーバーのIPアドレスを使用してWAFをバイパスします。
SNI 互換性
SNI は TLS1.0 以降のバージョンと互換性がありますが、SSL ではサポートされていません。
SNIは次のデスクトップブラウザーをサポートしています。
Chrome 5 以降のバージョン
Chrome 6 以降のバージョン (Windows XP)
Firefox 2 以降のバージョン
IE 7以降のバージョン (Windows Vista/Server 2008以降のバージョン、Windows XP上のすべてのバージョンのIEを除く)
Konqueror 4.7 以降のバージョン
Opera 8 以降のバージョン
Windows Vista/Server 2008以降のバージョンまたはMac OS X 10.5.6以降のバージョンでのSafari 3.0
SNIは次のライブラリをサポートしています。
GNU TLS
Java 7 以降のバージョン (クライアントとしてのみ機能)
HTTP クライアント 4.3.2 以降のバージョン
libcurl 7.18.1 以降のバージョン
NSS 3.1.1 以降のバージョン
OpenSSL 0.9.8j 以降のバージョン
OpenSSL 0.9.8f以降のバージョン (フラグが必要)
QT 4.8 以降のバージョン
Python3、Python 2.7.9以降のバージョン
SNIは次のモバイルブラウザーをサポートしています。
3.0 Honeycomb 以降のバージョンの Android ブラウザー
iOS 4 以降のバージョンの iOS Safari
Windows Phone 7 以降のバージョン
SNIは次のサーバーをサポートしています。
Apache 2.2.12 以降のバージョン
Apache Traffic Server 3.2.0 以降のバージョン
HAProxy 1.5 以降のバージョン
IIS 8.0 以降のバージョン
lighttpd 1.4.24 以降のバージョン
LiteSpeed 4.1 以降のバージョン
Nginx 0.5.32 以降のバージョン
SNIは、次のコマンドラインインターフェイスをサポートしています。
cURL 7.18.1 以降のバージョン
wget 1.14 以降のバージョン