名前ベースのバーチャルホストで複数のSSLを扱う(SNI使用)
1台のサーバで複数のドメインを使用する事になり、SSLで対応する事になりました。
調べ始めると、ポートを別々にしないと無理!
などが書いてあり、これはめんどくさいな~
とか思っていたのですが!!
深く調べるとどうやらSNIという便利拡張機能があるらしいのでそちらで対応してみます!
SNI:Server Name Indication
この拡張機能により名前ベースのバーチャルホストでもSSLが使用可能になりました。
ちなみにバージョンにより使用できないので、注意を!
Apache | 2.2.12以降 |
OpenSSL | 0.9.8j以降 |
※ブラウザでも対応してないバージョンがあるのでご注意を!
では、実際に設定します!
vi /etc/httpd/conf.d/ssl.conf
#追加
NameVirtualHost:443
#offに設定
SSLStrictSNIVHostCheck off
<VirtualHost *:443>
ServerName lamp-sv
DocumentRoot "/var/www/lamp-sv"
<Directory "/var/www/lamp-sv">
Options MultiViews
AllowOverride None
</Directory>
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLInsecureRenegotiation on
#「lamp-sv」用のサーバ秘密鍵と証明書
SSLCertificateFile /etc/pki/tls/certs/lamp-sv.crt
SSLCertificateKeyFile /etc/pki/tls/certs/lamp-sv.key
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog
ErrorLog logs/lamp-sv_error_log
CustomLog logs/lamp-sv_access_log combined env=!nolog
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
<VirtualHost *:443>
ServerName virtual-sv
DocumentRoot "/var/www/virtual-sv"
<Directory "/var/www/virtual-sv">
Options MultiViews
AllowOverride None
</Directory>
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLInsecureRenegotiation on
#「virtual-sv」用のサーバ秘密鍵と証明書
SSLCertificateFile /etc/pki/tls/certs/virtual-sv.crt
SSLCertificateKeyFile /etc/pki/tls/certs/virtual-sv.key
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog
ErrorLog logs/virtual-sv_error_log
CustomLog logs/virtual-sv_access_log combined env=!nolog
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
といった感じに設定すればOKです!
僕の場合は3ドメインあったので3つ設定しました。
SNIに未対応のブラウザ用に「SSLStrictSNIVHostCheck」デレクティブを off にしておきます。
SNIの仕組み
SNIではSSL/TLSのやりとりの中で、暗号化していないホスト名をサーバに伝えてくれるので、指定したバーチャルホストを表示することができます。
設定が楽になったので技術の進歩はすごいですね!
ありがとうございました!