Apache2でSNI †
1台のサーバーと1つのIPアドレスで複数のドメインをSSLで運用するにはSNIを使うと実現できます。Apache2+OpenSSLでSNIメモ
CentOSのyumはApache2.2.3までしか対応していないようなので自力インストールが必要でしたのでhttpd-2.2.25をインストール。
# apachectl configtest
Syntax error on line 437 of /usr/local/apache2/conf/httpd.conf:
SSLStrictSNIVHostCheck failed; OpenSSL is not built with support for TLS extensions and SNI
indication. Refer to the documentation, and build a compatible version of OpenSSL.
OpenSSLもYumでは0.9.8eまでしか入らない。SNIには0.9.8f以上が必要らしいのでこれも最新を自力インストールしました。
openssl-1.0.1e
# ./config shared
apache2を再コンパイル
./configure --prefix=/usr/local/apache2 --enable-dav --enable-proxy
--enable-ssl --enable-suexec --enable-rewrite --with-included-apr
--enable-so --with-ssl=/usr/local/ssl
起動してみると今度はこんなエラーが。
/usr/local/apache2/bin/apachectl configtest
/usr/local/apache2/bin/httpd: error while loading shared libraries:
libssl.so.1.0.0: cannot open shared object file: No such file or directory
仮対処としてリンクだけ貼って逃げました。
# cd /usr/local/apache2/lib
# ln -s /usr/local/ssl/lib/libssl.so.1.0.0
# ln -s /usr/local/ssl/lib/libcrypto.so.1.0.0
apache2起動、失敗。まだエラー
error_log
Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile] ((null):0)
SNIを使う場合、SSLのデフォルト値は効かない模様。これが出たら全てのバーチャルホストにSSLEngine行が入っているかチェックしましょう。
最終的にこんな風になって、無事に証明書の切替が実現できました。
Include conf/extra/httpd-ssl.conf
SSLStrictSNIVHostCheck off
NameVirtualHost *:80
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot <path>
ServerName <domain A>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
SSLCertificateFile <crt A>
SSLCertificateKeyFile <key A>
SSLCACertificateFile <intermediate.crt>
</VirtualHost>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot <path>
ServerName <domain B>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
SSLCertificateFile <crt B>
SSLCertificateKeyFile <key B>
SSLCACertificateFile <intermediate.crt>
</VirtualHost>