Server Name Indication対応
ヴァーチャルホストに対応しましたが、SSL通信時は同一の証明書を使用するのを何とかしたいなー…と調べてみたら設定方法がありました。
ちなみになぜ複数の証明書を使えないのかは下記のとおりです。
“HTTPSの場合、HTTP要求をやりとりする前にSSL/TLSハンドシェイクを行う必要がある。このため、ブラウザがどのホストを訪問するかを、ハンドシェイク時点でサーバ側には予測できず、HTTPヘッダのホスト名によって複数枚のサーバ証明書を使い分けることができない。”
[Wikipediaより一部引用]
ではさっそくSNI(Server Name Indication)を試してみます。
※参考 : Webサーバー間通信内容暗号化(Apache+mod_SSL)
SSL設定は手順通りですが、ここからさらにssl.confに追加・修正していきます。なお、Apacheのバージョンが2.2.12以降であることが条件のようです。
# vi /etc/httpd/conf.d/ssl.conf
:
(中略)
##
## SSL Virtual Host Context
##
NameVirtualHost *:443 ←追加
SSLStrictSNIVHostCheck off ←追加
<VirtualHost *:443> ←修正
ServerName dukehide.dip.jp ←追加
DocumentRoot "/var/www/html/public_html"
<Directory "/var/www/html/public_html"> ←追加
</Directory> ←追加
:
(中略)
:
※以下VirtualHost関連SNI追加
<VirtualHost *:443>
ServerName dukehide.mydns.jp
DocumentRoot "/var/www/html/virtual_html"
<Directory "/var/www/html/virtual_html">
</Directory>
ErrorLog logs/ssl_error_virtual_log
TransferLog logs/ssl_access_virtual_log
LogLevel warn
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile /etc/pki/tls/certs/virtual_ssl.crt
SSLCertificateKeyFile /etc/pki/tls/certs/virtual_ssl.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_virtual_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
:
(中略)
##
## SSL Virtual Host Context
##
NameVirtualHost *:443 ←追加
SSLStrictSNIVHostCheck off ←追加
<VirtualHost *:443> ←修正
ServerName dukehide.dip.jp ←追加
DocumentRoot "/var/www/html/public_html"
<Directory "/var/www/html/public_html"> ←追加
</Directory> ←追加
:
(中略)
:
※以下VirtualHost関連SNI追加
<VirtualHost *:443>
ServerName dukehide.mydns.jp
DocumentRoot "/var/www/html/virtual_html"
<Directory "/var/www/html/virtual_html">
</Directory>
ErrorLog logs/ssl_error_virtual_log
TransferLog logs/ssl_access_virtual_log
LogLevel warn
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile /etc/pki/tls/certs/virtual_ssl.crt
SSLCertificateKeyFile /etc/pki/tls/certs/virtual_ssl.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_virtual_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
ただし、全てのブラウザやサーバーがSNIに対応しているわけではないようです。もっとも最近のOSやブラウザであれば大丈夫でしょうから、気にしないことにします (^^;)
例としてiPhoneからhttpsにてアクセスしてみた場合です。同一IPアドレスにて複数のサーバー証明書が利用できています。