1台のサーバで複数のSSL通信をする
ApacheのNameVirtualHostで設定した複数のサイトでHTTPS通信をしたかったので、いろいろ調べてみた。
その過程でわかったことをまとめてみます。
間違い等あると思うので、ご指摘お願いします。
SSL通信の仕様
SSLの仕様として
というものがあります。*1
逆に言えば、IPアドレスかポートを変更すれば、複数のサーバ証明書を持つことができます。
IPアドレスを変える場合
- xxx.xxx.xxx.xxx(1枚目)
- yyy.yyy.yyy.yyy(2枚目)
ポートを変える場合
- xxx.xxx.xxx.xxx:443(1枚目)
- xxx.xxx.xxx.xxx:444(2枚目)
上記のような形でWebサーバのバーチャルホスト設定をすれば、1台のサーバ上で複数の証明書を用いて通信することができます。
単一のIPアドレスとポートで複数のSSL通信をするには?
IPアドレスやポートを変えれば、1台のサーバで複数のサーバ証明書を持つことができると書きました。
しかし、不特定多数に公開しているサーバでバーチャルホスト設定をするときにはネームベースで設定することが多いと思います。*2
つまり、ドメイン名ごとに証明書を切り替えたい。
ただし、前述の通り、あるIPアドレス:ポートの組み合わせに対して指定できるサーバ証明書は1つだけです。
この制限に引っかからないように、複数ドメインでのSSL通信を実現するための方法が2つあります。*3
- ワイルドカード証明書
- マルチドメイン証明書
どちらの証明書も単一のサーバ証明書の中に複数のドメインを紐付けすることによって、「あるIPアドレスとポートの組み合わせに対して紐付けられるサーバ証明書は1つだけ」という仕様を守りつつ、複数ドメインのSSL通信に対応しています。
これから、それぞれの証明書について書いていきます。
ワイルドカード証明書
ワイルドカード証明書は1つの証明書でCN(コモンネーム)のサブドメインすべてをカバーする証明書です。
CNを*.example.comで申請した場合
example.com | 有効 |
www.example.com | 有効 |
admin.example.com | 有効 |
smtp.example.com | 有効 |
www.admin.example.com | 無効 |
example.net | 無効 |
同じ階層にある複数のサブドメインでSSLを使いたい場合に有効です。
ただし、バーチャルホストで「example.com」と「example.net」を扱いたい場合など、異なるドメインの間では使用出来ません。
また、VeriSignが発行していないなど、入手できるサイトが若干限られています。
マルチドメイン証明書
マルチドメイン証明書は1つの証明書に対し、通常のCNを登録するだけでなく、SANs(Subject Alternative Names)に記載されたドメインへのSSL通信を可能にする証明書です。
ワイルドカード証明書にはできない別ドメインの証明も行える一方、サブドメインについてもひとつひとつ別々に登録する必要があります。
なお、発行会社によって登録可能なドメインの数は異なりますが、概ね100〜150個のドメインをひとつの証明書に登録できます。
このように便利なマルチドメイン証明書ですが、TLS拡張のSNIという技術を使用するため、WindowsXP*4やいわゆるガラケーなどの環境では使えません。*5
まとめ
HTTPSでアクセス可能な複数ドメインをバーチャルホストで運用するためには、
- サブドメインだけなら、ワイルドカード証明書で対応可能。
- 異なるドメインを含むなら、マルチドメイン証明書。ただし、レガシー勢は切り捨てないといけない。
顧客に対して間口を広げる必要があり、かつ、クレジットカード情報等を扱うためにHTTPSを必須とするECサイトとかはどうすればいいんですかね?