次のシナリオを考えます。同じ IP: ポートに関連付けられ、異なるホストヘッダーで構成された複数のサイト (たとえば、site1.marei.com、site2.marei.com、および site3.marei.com) があります。 SSL サイトごとに証明書をデプロイしています。 この場合、これらの Web サイトを閲覧する場合、証明書の不一致エラーがまだ発生しています。
IIS の場合
原因
https リクエストは暗号化された形式で IIS サーバーに到着するため、適切なサーバー証明書で復号化する必要があります。 各サイトは一意の証明書に関連付けられているため、サーバーはリクエスト内のさまざまなホストヘッダーに基づいて、どの証明書を復号化に使用するか判断する必要があります。 ただし、ホストヘッダーもリクエストの一部として暗号化されます。 その結果、IIS サーバーは IP: ポートサイトに関連付けられている最初の証明書を使用してリクエストを復号化しなければならず、これにより、他のサイトへのリクエストが失敗し、エラーが発生する可能性があります。
解決策
- 解決策 1: 各 HTTPS サイトを一意のポートに関連付けます。 この解決策を使用して、訪問者は Web ページ、たとえば、https://site.domain.com:444 を閲覧するときに手動でポートを指定する必要があります。
- 解決策 2: 各サイトに別々の IP を割り当てます。競合が解消され、ホストヘッダーを追加する必要がなくなります。
- 解決策 3: ワイルドカード証明書を使用し、そのワイルドカード証明書を *.domain.com に関連付けます (この例では、*.marei.com を使用します ) 。 このようにして、このドメインへのリクエストはすべてこの証明書で復号化され、証明書不一致エラーがなくなります。
- 解決策 4: IIS 8 にアップグレードし、SNI (Server Name Indication) を有効にします。
これにより、サーバーはリクエストから抽出されたホストヘッダーを使用して証明書を見つけることが可能です。
SNI を有効にする方法の詳細については、「IIS 8.0 SNI (Server Name Indication): SSL スケーラビリティ」をご参照ください。
Nginx の場合
Nginx インストールディレクトリ配下の conf ディレクトリにある nginx.conf ファイルを開き、以下の設定を探します。
server {
listen 443;
server_name domain1;
ssl on;
ssl_certificate //Disk directory/Certificate order No. 1.pem;
ssl_certificate_key //Disk directory/Certificate order No. 1.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:! DH:! EXPORT:! RC4:+HIGH:! MEDIUM:! LOW:! aNULL:! eNULL;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
追加の設定セグメントを追加します。
server {
listen 443;
server_name dommain2;
ssl on;
ssl_certificate //Disk directory/Certificate order No. 2.pem;
ssl_certificate_key //Disk directory/Certificate order No. 2.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:! DH:! EXPORT:! RC4:+HIGH:! MEDIUM:! LOW:! aNULL:! eNULL;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
この解決策を使用して、Nginx サーバーで複数証明書サポートを有効にします。
Apache の場合、次のように HTTPS 仮想ホストを設定してポート 443 を共有します。
Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
……
ServerName www.example1.com
SSLCertificateFile common.crt;
SSLCertificateKeyFile common.key;
SSLCertificateChainFile ca.crt
……
</VirtualHost>
<VirtualHost *:443>
……
ServerName www.example2.com
SSLCertificateFile common2.crt;
SSLCertificateKeyFile common2.key;
SSLCertificateChainFile ca2.crt
……
</VirtualHost>