HTTPS プロトコルで 1 つのホストのみを表示するように Apache を調整する方法

HTTPS プロトコルで 1 つのホストのみを表示するように Apache を調整する方法

私はFreeBSDでWebサーバーApacheを使っていて、SSLを多くのドメインのうちの1つだけにバインドしたいと思っています。現在の設定は次の通りです。

NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

すべてOKですが、ブラウザではhttps://www.domain01.com/ssldomain.com サイトのページが表示されます。これはまずいです。

Apacheを調整してssldomain.comのページが表示されないようにするにはどうすればいいですか?https://www.domain01.comブラウザで。

UPD: 両方のドメインに VirtualHosts :80 と :443 を定義しようとしていました。1) 両方のドメインに ssldomain.com のオリジナル SSL を使用。2) ssldomain.com にオリジナル SSL を使用し、domain01.com に自己署名 SSL を使用。どちらの場合も、ブラウザは HTTPS の証明書のエラーを表示しますが、ページは正常です。

この2つのケースの設定

Include etc/apache22/extra/httpd-ssl.conf

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
SSLEngine on
SSLCertificateFile "/usr/local/etc/apache22/ssl/domain01.com/server.cert"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/domain01.com/server.key"
# This is for second case (of course 2 lines above are comments)
# SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
# SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
# SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
# SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"

#Redirect permanent / http://www.domain01.com/
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

敬具!

答え1

Apache は、一致する ServerName または ServerAlias を持つ vhost が見つからない場合、その IP (またはこの場合は * のように一致するワイルドカード) とポート (443) の最初の vhost をデフォルトとして使用します。したがって、www.ssldomain.com:443 で行ったように、ポート 443 で www.domain01.com の別のサイトを設定する必要があります。そうしないと、デフォルトとして設定されている唯一のサイトに戻ってしまうことになります。

このvhostは、必要に応じてHTTPにリダイレクトするように設定できます(このリダイレクトはSSL ネゴシエーションには有効な証明書が必要です (すべての SSL vhost には証明書を設定する必要がありますが、その vhost でも有効な場合は同じ証明書を使用できます)。

その点、なぜ証明書エラーが発生しないのでしょうか?https://www.domain01.com? おそらく、そうであるか (無視した場合にのみ www.ssldomain.com コンテンツが表示されます)、証明書が両方のドメインをカバーしているか (その場合は、これを別の vhost として設定し、http にリダイレクトするのが間違いなく正しい方法です) のどちらかだと思います。

ところで、一般的な考えとは反対に、ないApache インスタンスに複数の SSL ホストを設定するには、別の IP アドレスが必要です (SNI をサポートしていない古いブラウザの場合でも)。別の回避策があります。詳細については、こちらをご覧ください。Apache 上の特定の仮想ホストの SNI を無効にする

答え2

これは私の場合はうまくいきます。ドメインの順序を変更するだけです。最初は元の SSL 証明書を持つ ssldomain.com で、2 番目は同じ SSL 証明書とリダイレクトを持つ domain01.com です。

Include etc/apache22/extra/httpd-ssl.conf

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"

Redirect permanent / http://www.domain01.com/
</VirtualHost>

@BazzaDP に特別な感謝を申し上げます。

関連情報