SSL証明書の適用メモ

サーバーの通信を暗号化するためSSL証明書を発行したが、その適用になかなか手間取った。 というか適用できたかどうかの確認を行う際、URLにhttpsを指定していなかったため適用できた後もしばらく気づかずに試行錯誤していた。

そのときに気づいた点をいくつかまとめてみる。

1.mod_sslについて

まずSSLを扱うためにはmod_sslをインストールする必要がある。普通にyumでインストールすればいいのだが、apache2.4以降を使っているとエラーが起こることがあるらしい。そうなった場合はmod_ssl24をインストールしよう。

インストールが成功するとssl.confなどsslに必要なものがいろいろ生成される。

2.ポートについて

平文(http)での接続には80番、暗号文(https)の接続には443番のポートが基本的に用いられる。 80番のポートはサーバーを作った時点で自動的に開いていたが、443番のポートは新しく開ける必要があった。そのため以下のコマンドを追加した。

Listen 443

Listenというのは待機状態みたいな意味らしい。 ちなみにこのコマンド、ssl.confとhttpd.confのどちらに追加してもページは正常に動作した。ただし両方に追加すると「定義が重複している」としてエラーになった。

3.ssl.confの設定

ssl.confの中ではVirtualHostを使う必要があった。これは一つのサーバーで複数のドメインを扱う機能のことなのだが、調べると例が複数出てきて少しずつ書き方が違うためどれが正しいのかわからず、個人的にはSSL証明書の適用に関してこの部分が一番面倒だった。なかなか適用がうまく行かず、原因を色々調べては試してみた。まあ結局原因は先述の通りブラウザのURLだった訳だけども。

なんか悔しかったので調べた原因候補を改めて検証してみたところ、結局どれもあまり関係ないことがわかった。

初めにNameVirtualHostというコマンド。

VirtualHostの記述を始める前に書く必要があるコマンドらしい。が書くと「無効な記述」としてエラーが出る。よく調べてみると必要なのは過去のバージョンのapacheのようで、apache2.4では必要ないということがわかった。

次にdefault:443と*:443の違い

VirtualHost内の記述でどちらのパターンもあったのだが、*:443が末尾が443のIPすべてを指定するのに対し、_default_:443は443番ポートに来た他のVirtualHostで使われていないアドレス宛のリクエストをすべて受けつけるという意味らしい。 つまりVirtualHostを一つしか使っていないならどちらでも問題ないと思う。実際どちらで書いても動作は変わらなかった。

最後に証明書と秘密鍵に関して

今回使った証明書はLet’s Encryptを使って発行したものだったのだが、この4つが発行された。

サーバ証明書のcert1.pem

中間CA証明書のchain1.pem

これらをまとめたfullchain1.pem

秘密鍵のprivkey.pem

これらのパスをVirtualHost内に書くのだが、そのパスは/etc/letsencrypt/archive/[ドメイン名]/になっていた。 ところでこれらとは別に、/etc/letsencrypt/live/[ドメイン名]/以下にも同じようなものが生成される。こちらは先程の4つへのダイレクトリンクになっていた。 ssl.confにはどちらを書くべきか迷ったが、試したところどちらでも問題なかった。

また「中間CA証明書を書くSSLCertificateChainFile というコマンドはapache2.4では動作しないため、サーバ証明書と中間CA証明書を分けずにまとめた物のみを書く」という情報もあったが、分けてもまとめても動作に違いはなかった。