問題の説明
- 複数のWebサイトは、サーバーの同じIPアドレスとポートに関連付けられています。
- サーバは、クライアントから送信される要求内のホストヘッダを区別することができる。
- 各WebサイトにSSL証明書が適用され、インストールされています。 ただし、Webサイトにアクセスすると、システムは証明書が一致しないことを示すメッセージを返します。
原因
サーバーがHTTPSリクエストを受信すると、サーバーは必要なサーバー証明書を使用してリクエストを復号化する必要があります。 各Webサイトは、一意の証明書に関連付けられています。 サーバーは、リクエスト内のホストヘッダーに基づいて、HTTPSリクエストを復号化するために必要な証明書を決定します。 ただし、ホストヘッダーは暗号化されています。 したがって、サーバーは、IPアドレスとポートに最初に関連付けられているWebサイトの証明書を使用して、HTTPSリクエストを復号します。 このHTTPSリクエストが別のWebサイト宛てである場合、復号化は失敗し、エラーメッセージが返されます。
解決策
このトピックでは、3種類のwebサーバーに対するさまざまなソリューションを提供します。
IIS
- Webサイトを一意のポートに関連付けるHTTPS Webサイトを同じIPアドレスの一意のポートに関連付けます。 たとえば、HTTPS Webサイトを
[$Domain]:[$port]
形式のポートに関連付けることができます。 ただし、クライアントブラウザーを使用してWebサイトにアクセスする場合は、アドレスバーでポートを手動で指定する必要があります。説明- [$Domain]: Webサイトのドメイン名。
- [$Port]: ポート。
- Webサイトを一意のIPアドレスに関連付ける
HTTPS Webサイトを一意のIPアドレスに関連付けます。 この方法を使用すると、リクエストの競合は発生せず、リクエストにホストヘッダーは必要ありません。 しかし、この方法のコストは高い。
- ワイルドカード証明書の使用
Webサイトにワイルドカード証明書を使用します。 たとえば、
example.aliyundoc.com
,demo.aliyundoc.com
、およびlearn.aliyundoc.com
ウェブサイトは証明書を使用できます。. aliyundoc.com
ドメイン名がバインドされています。 この方法を使用すると、Webサイト宛てのすべてのリクエストは、ワイルドカード証明書を使用して復号化できます。 - IISサーバーのアップグレード
IISサーバーをIIS 8.0にアップグレードして、サーバー名表示 (SNI) を有効にします。 このようにして、IISサーバーはリクエスト内のホストヘッダーを直接読み取り、必要な証明書を特定できます。 SNIを有効にする方法の詳細については、「SSLスケーラビリティ」をご参照ください。
NGINX
仮想ホストをNGINXサーバーに追加して、複数のWebサイトをサーバーの同じIPアドレスとポートに関連付けます。 次の操作を実行します。
- NGINXサーバーにログインし、次のコマンドを実行してNGINX構成ファイルを開きます。
vim [$Nginx_Dir]/conf/nginx.conf
説明 [$Nginx_Dir] は、NGINXサーバのインストールディレクトリを示します。 デフォルトのインストールディレクトリは /usr/local/nginxです。 - 設定ファイルを次の内容に変更します。
server { listen 443; server_name [$Domain1]; ssl on; ssl_certificate [$Certificate_Path1]; ssl_certificate_key [$Key_Path1]; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers [$Ciphers_Suite1]; ssl_prefer_server_ciphers on; 場所/{ ルートhtml; インデックスindex.html index.htm; } } server { listen 443; server_name [$Domain2]; ssl on; ssl_certificate [$Certificate_Path2]; ssl_certificate_key [$Key_Path2]; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers [$Ciphers_Suite2]; ssl_prefer_server_ciphers on; 場所/{ root html; index index.html index.htm; } }
Apache
- Apacheサーバーにログインし、次のコマンドを実行してssl.conf構成ファイルを開きます。
vim [$Apache_Dir]/conf.d/ssl.conf
説明- [$Apache_Dir] は、Apacheサーバーのインストールディレクトリを示します。 デフォルトのインストールディレクトリは /etc/httpdです。
- ssl.conf設定ファイルが見つからない場合は、
yum install mod_ssl -y
コマンドを実行してSSL関連モジュールをダウンロードします。 - ApacheサーバーのSNIを有効にした後、SSLStrictSNIVHostCheck offを構成ファイルに追加する必要があります。
- 構成ファイルを次のコンテンツに変更します。
Listen 443 NameVirtualHost *:443 <VirtualHost *:443> … ServerName [$Domain1] SSLCertificateFile [$Certificate_Path1]; SSLCertificateKeyFile [$Key_Path1]; SSLCertificateChainFile [$Certificate_Chain1]; … </VirtualHost> <VirtualHost *:443> … ServerName [$Domain1] SSLCertificateFile [$Certificate_Path2]; SSLCertificateKeyFile [$Key_Path2]; SSLCertificateChainFile [$Certificate_Chain2];
説明- 無料証明書などの
www.example.com
およびexample.com
ドメイン名がバインドされた証明書を使用する場合は、次の形式でドメイン名を指定することを推奨します。 そうしないと、wwwを含むドメイン名にアクセスできなくなる可能性があります。ServerNam e example.com
ServerAlia s www.example.com
- [$Certificate_Chain1]: 最初のWebサイトの中間証明書のバンドルへのパス。
- [$Certificate_Chain2]: 2番目のWebサイトの中間証明書のバンドルへのパス。
- Apache V2.4.8以降では、SSLCertificateChainFileの値がSSLCACertificatePathの値に置き換えられます。
- 無料証明書などの