Let’s Encryptで複数ドメイン対応の証明書を発行する

最近はSSL証明書が安くなってますね。単に暗号化したいだけならオレオレ証明書が当たり前でしたが、Let’s Encryptという選択肢が出てきましたね。ってか、単に暗号化したい以外に何があるんだって言いたいですけど。DNS乗っ取られたら・・・。

そんな心配は置いといて、我がサイトもSSL対応にしようかとLet’s Encryptをお試し。手順はそこら中にあるからいいよね。そんな数ある中で公式のユーザーガイドにはこんなコマンドが載っています。

certbot certonly –webroot -w /var/www/example/ -d www.example.com -d example.com -w /var/www/other -d other.example.net -d another.other.example.net
情報源: ユーザーガイド – Let’s Encrypt 総合ポータル.

なんじゃこりゃ。exampleが同じなのでスルーしてしまいそうだけど、TLDが.comと.netで違う。そう、全く異なるドメイン名を組み合わせて証明書を発行できるのです。

これは素晴らしいことです。何が素晴らしいって、IPアドレスの節約になるのです。WebサーバをSSLで公開する場合、通常はSSL証明書ひとつに対してひとつのIPアドレスが必要になります。というのは、アクセスする際にドメイン名を使用し、証明書にもドメイン名が書いてあり、クライアント側としてはそれらを照合したいんだけど、サーバ側ではどのドメイン名にアクセスしてきのかは暗号化された通信の中に書いてあるため、証明書に対応する鍵を使って復号してからでないとドメイン名が判明しないからなのです。

これは言ってみれば、「どの箱に入っているか当ててみろ、正解は箱の中に入っているからな。」という状況なのだ。箱がひとつだけなら、どの箱にするか迷うことはありません。Let’s Encryptなら箱をひとつだけにしてしまう、という解決方法が取れるのです。

というわけで、自分の持ってるドメイン名を使ってやってみました。
https://imys.la/
https://loggers.jp/
同じ証明書でSSL化しています。

証明書の内容はどうなっているかというと、こんな感じ。
ssl-imysla-general
Subjectは引数で先に指定した方が優先されるようですね。

じゃあもうひとつのドメイン名はどこへ行ったかというと、別名の方でした。
ssl-imysla-detail
どうやら、この別名、業界ではSubject Alt Name (SAN) と呼んでいるようです。SANと言われると自分的にはStorage Area Networkなんだけど、それは関係ありません。

仕様的には100個の別名を指定できるようです。

最大 100 ドメインを 1 つの証明書で保護
情報源: マルチドメイン機能(SANs)|シマンテック.

まぁ、共有サーバを運営していると嬉しいですが、借りる方だとちょっとね。だって、関係ないドメイン名が乗っているんですもの。

そんなわけで、結局は開発サーバとかの用途でしか活躍しないのかも。

で、思い出したのはSNI、Server Name Indication。SSLの拡張で、クライアント側から接続する際に接続先のドメイン名を指定できる機能です。さっきの例で言うと、箱に名前を書いておく感じです。うん、それだよね。それがいい。って、何してたんだ、自分。

けど、どちらの機能も後付の機能になるので、古いブラウザや一部のガラケーでは使えないようです。逆に言うと、ちゃんとアップデートしているユーザやスマホは大丈夫。ターゲットに応じて選択を。