Apacheのバーチャルホスト(SNI)で複数ドメインにSSLを導入

Googleが2014年8月に「SSL化されたページのインデックスを早める(SEOにも多少影響)」とアナウンスしてから世界中でウェブサイトのSSL化が進んでいます。

Amazonが「Elastic Load Balancing」や「Amazon CloudFront」で使える証明書を無料で発行するサービスを開始しましたし、導入が簡単なサービスも増え、ウェブのSSL化は今後も加速していくことでしょう。

ApacheのバーチャルホストにSSLを導入

SSLを使うなら1ドメインにつきIPが1つ必要だと言われていた時代もありましたが、TLS拡張のSNI(Server Name Indication、サーバー ネーム インディケーション)と呼ばれる仕様により、IPが1つ(サーバーが1台)でも複数ドメインに証明書を設定することが可能になります。

この仕様は2006年に策定されていますが、ブラウザの通信(主にIE)が対応していないためIPベースでの対応が主流でした。しかしここ数年でサポートの終わったWindows Vistaを捨て、自動アップデートやモダン仕様対応により結構使えるようになってきたIE/Edgeの利用者が増えてきたことにより、いよいよSNIを使っても問題がない土台が整いました。

SNIのブラウザ対応状況

各ブラウザの対応は以下のようになっています。
(OSがWindows XPの場合はどのブラウザを使用しても利用できないので、Vista以降であることが前提)

  • Internet Explorer 7以降
  • Google Chrome 6以降
  • Firefox 2.0以降
  • Opera 8.0以降
  • Safari 2.1以降
  • iOS:Safari 3.0以降
  • Android:Android 3.0以降
  • フィーチャーフォン:未対応

HTML5とCSS3で作られるサイトであれば、上記のブラウザバージョン以上の環境であることが前提だと思うのでSNIによるSSL化で問題はないのかと思われます。

ApacheでSNIを利用したSSL設定

ApacheでSNIを使う場合は、通常のSSLの設定に加えてバーチャルホストの設定と同じような設定をドメイン毎にしてやれば動きます。

Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/var/run/apache2/ssl_scache(512000)"
SSLSessionCacheTimeout 300
Mutex default ssl-cache

##
## SSL Virtual Host Context
##
<VirtualHost *:443>
    ServerName apecell.com:443
    DocumentRoot "/var/www/html"
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile "/etc/pki/tls/certs/server.crt"
    SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
    CustomLog logs/ssl-access_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    ErrorLog logs/ssl-error_log
</VirtualHost>

1台のサーバーでユーザー側(apecell.com)と管理側(admin.apecell.com)をサブドメインで変えるような場合もワイルドカード証明書と合わせれば手軽に導入できます。

もうSSL化にIPが必要だなんて言わせない(言いたくない)。