function Geek()

技術的な備忘録が多くなってる。

名前ベースのバーチャルホストで複数の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のやりとりの中で、暗号化していないホスト名をサーバに伝えてくれるので、指定したバーチャルホストを表示することができます。

 

設定が楽になったので技術の進歩はすごいですね!

ありがとうございました!