xxxcaqui.log

ツッコミお待ちしています

1台のサーバで複数のSSL通信をする

ApacheのNameVirtualHostで設定した複数のサイトでHTTPS通信をしたかったので、いろいろ調べてみた。

その過程でわかったことをまとめてみます。
間違い等あると思うので、ご指摘お願いします。

SSL通信の仕様

SSLの仕様として

あるIPアドレスとポートの組み合わせに対して紐付けられるサーバ証明書は1つだけ

というものがあります。*1

逆に言えば、IPアドレスかポートを変更すれば、複数のサーバ証明書を持つことができます。

IPアドレスを変える場合

  1. xxx.xxx.xxx.xxx(1枚目)
  2. yyy.yyy.yyy.yyy(2枚目)

ポートを変える場合

  1. xxx.xxx.xxx.xxx:443(1枚目)
  2. xxx.xxx.xxx.xxx:444(2枚目)

上記のような形でWebサーバのバーチャルホスト設定をすれば、1台のサーバ上で複数の証明書を用いて通信することができます。

単一のIPアドレスとポートで複数のSSL通信をするには?

IPアドレスやポートを変えれば、1台のサーバで複数のサーバ証明書を持つことができると書きました。
しかし、不特定多数に公開しているサーバでバーチャルホスト設定をするときにはネームベースで設定することが多いと思います。*2

つまり、ドメイン名ごとに証明書を切り替えたい。

ただし、前述の通り、あるIPアドレス:ポートの組み合わせに対して指定できるサーバ証明書は1つだけです。

この制限に引っかからないように、複数ドメインでのSSL通信を実現するための方法が2つあります。*3

  1. ワイルドカード証明書
  2. マルチドメイン証明書

どちらの証明書も単一のサーバ証明書の中に複数のドメインを紐付けすることによって、「ある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サイトとかはどうすればいいんですかね?

*1:SSLハンドシェイクに関連する制約です。

*2:複数のIPアドレスを持っているサーバばかりではないし、ポート指定はいろいろ困る。

*3:他にUCC(Unified Communications Certificate)というものもあるようですが、Windows Exchange Server用の証明書のようなので、とりあえずスルーします。あと、マルチドメイン証明書との具体的な違いもよくわからない。

*4:ただし、Chromeを除く。

*5:ちなみに、前述のUCCはWindowsでサポートされてるみたいです。