SNIとは_AWSで使用するには #419
ウェブホスティングプロバイダーやCDNサービスなど、リソースを効率的に使用したいサービスでは、単一のIPアドレスを使用して複数のドメインまたはサブドメインのSSLトラフィックを提供したい場合があります。
そんな機能を実現する技術がSNI (Server Name Indication)です。
SNIについては以前にもまとめましたが、改めて整理しました。
SNIとは
基本: SNIは、TLS(SSLの後継)での拡張機能であり、クライアントが初期の接続段階でホスト名を伝えることを可能にします。
動作: 通常、HTTPSの接続が開始される際にサーバーはその証明書をクライアントに送信します。しかし、どの証明書を送信するかをサーバーが知るためには、どのドメインをクライアントがアクセスしようとしているのかを知る必要があります。SNIは、クライアントが最初のハンドシェイクの間にこのドメイン情報をサーバーに提供することで、サーバーが正しい証明書を返すのを助けます。
利点: これにより、同じIPアドレスを共有する複数のドメイン(またはサブドメイン)ごとに異なるSSL証明書を使用することが可能となります。
制限: 古いブラウザやシステムはSNIをサポートしていない可能性があるため、すべてのユーザーにSNIを頼るサービスを提供する前に、ターゲットの顧客層を考慮する必要があります。
実際の使用: ウェブホスティングプロバイダーやCDNサービスなど、リソースを効率的に使用したいサービスでよく使用されます。
簡単に言うと、SNIは一つのサーバーが同じIPアドレスを使用して、複数のSSL証明書を持つ複数のドメインのトラフィックを処理する能力を持つことを可能にします。
AWSでSNIを使うには
AWSでは、いくつかのサービスを使用してSNI(Server Name Indication)を利用できます。以下は、SNIをサポートしている主なAWSサービスと、それらを使用する際の方法です。
Amazon CloudFront:
CloudFrontはAWSのコンテンツデリバリネットワーク(CDN)サービスであり、SNIを使用して複数のドメインのSSL/TLS証明書をサポートしています。
CloudFrontの配信設定を作成する際に、特定のドメイン用のSSL/TLS証明書を指定できます。証明書はAWS Certificate Manager(ACM)または他の認証機関から取得できます。
1つの配信設定で複数のドメインをサポートする場合、SNIを利用してそれぞれのドメインに合わせた証明書を提供します。
Application Load Balancer (ALB):
ALBもSNIをサポートしており、異なるドメインやサブドメインに対して異なるSSL/TLS証明書を使用できます。
リスナールールを使って、特定のドメインやURLパスに基づいてトラフィックをルーティングします。それぞれのルールで異なる証明書を指定することができます。
証明書はAWS Certificate Manager(ACM)を利用して簡単に取得・管理できます。
AWS Certificate Manager (ACM):
ACM自体はSNIを提供するサービスではありませんが、CloudFrontやALBなどのAWSサービスと統合して、SSL/TLS証明書を無料で簡単に取得・管理することができます。
ACMから取得した証明書は、SNIをサポートする他のAWSサービスと統合して使用することができます。
これらのサービスを使用することで、AWS環境内で複数のドメインやサブドメインを持つアプリケーションやウェブサイトを効果的にホストし、SNIを利用してそれぞれに合ったSSL/TLS証明書を提供することができます。
SNIを使わずに実現するには
SNIを使わない場合でも、一つのサーバー(特定のIPアドレス)が多くのドメインをサポートすること自体は可能です。しかし、SSL/TLS(HTTPS)のコンテキストにおいて問題が生じます。
以下、SNIを使用しない場合のHTTPSの制約と解決策について説明します。
ワイルドカード証明書: ワイルドカード証明書を使用すると、特定のトップレベルドメインの任意のサブドメインに対して有効なSSL証明書を取得できます。例えば、*.example.comの証明書はwww.example.comやblog.example.comなどに有効です。しかし、これはサブドメインに限られ、複数のトップレベルドメインに対しては有効ではありません。
統合(SAN、Subject Alternative Name)証明書: これは、単一のSSL証明書の中に複数のドメイン名やサブドメイン名を含めることができる証明書です。しかし、証明書に追加できるドメインの数には上限があり、後から追加や削除することが煩雑です。
制約: いずれの方法を使用しても、クライアントがどのドメインにアクセスしようとしているのかを事前に知ることができず、そのためにクライアントが最初に要求したドメインに基づいて適切なSSL証明書を提供することができません。SNIが存在しない場合、サーバーは単一のデフォルトの証明書しか提供できません。この制約のため、同じIPアドレス上で複数のドメインを持つサーバーにはSNIが強く推奨されます。
結論として、SNIを使用せずに一つのサーバーが多くのドメインをサポートすることは技術的に可能ですが、SSL/TLSを適切にサポートするためにはSNIが非常に有用であり、現代の多くのウェブ環境ではほぼ必須となっています。
ここまでお読みいただきありがとうございました!
この記事が気に入ったらサポートをしてみませんか?