VPS+ApacheにSSL/TLSを導入する

Let’s Encrypt というサービスを利用することで、無料でサーバ証明書を発行することができるようです。スポンサーには Cisco, Hewlett Packard Enterprise などがいるので、それなりに安心して使えると思います。

スポンサーリンク

SSL/TLS

詳しい説明は他に譲りますが、パスワードなどが漏れずに安全にサイトへ接続するため暗号化した通信をするためのプロトコルです。TLS が強度的にも推奨されていますが、昔からの名残で SSL と呼ばれることもたくさんあるようです。

サーバ証明書は普通数千円くらいするので、弱小個人サイトではなかなか手を出しにくいですが、このようなサービスもあるんですね。サーバ証明書もセキュリティ証明書とか呼ばれたりしていますが、これも混同しててよくわからんです…

複数サイトへの適用

バーチャルホスト設定を利用していてサイトが複数ある場合でも、サブドメインでは同じ証明書が使えます。(ワイルドカード証明書)

しかし、ホスト名が全く異なる場合=ドメインが全く異なる場合は利用できません。HTTP サーバに対して一つしか使えないからです。そのため、複数のメインドメインを持っているなら、どのドメインに SSL/TLS を当てるか決めておきましょう。

Let’s Encrypt

環境

  • CentOS7
  • Apache2.4.6

インストール

Certbot クライアントのインストール自体は簡単です。

root もしくは sudo で実行します。

サーバ証明書の発行

まず、証明書を発行するためには Apache を停止させる必要があります。そのため、人が過疎っている時間帯が望ましいです。

なぜそんな辛いことになってるのかというと、証明書のタイプがドメインを所有していることを確認するドメイン認証で、証明書の発行に 80 番ポートと 443 番ポートを利用するからだとか。

もちろん 80 番ポートと 443 番ポートが開放されていないと使えません。

ポート開放の方法はこちらで確認してください。→ VPS に Apache, MySQL, firewall を設定する

Web サーバを停止したら発行に移ります。

-d オプションでドメインを追加できます。ここでは例として example.com, www.example.com に発行します。

実行がスタートし、更新がなければメールアドレスの入力、規約への同意が行われます。メールアドレスは緊急通知や証明書の期限の通知などに使われるようです。

発行後したら忘れずに Apache を起動します。すぐに終わるので、サーバが停止している時間は短く済むのが救い。

サーバ証明書の保存場所

サーバ証明書の本体は /etc/letsenrypt/archive/example.com 以下にあります。サーバ証明書、中間証明書、それらを統合した証明書、秘密鍵の 4 ファイルが生成されますが、Apache のバージョンや Nginx など別の Web サーバで使うものが異なります。

Apache 2.4.8 以前の場合はサーバ証明書 (cert.pem) 、中間証明書 (chain.pem) 、秘密鍵 (privkey.pem) の 3 ファイルが必要です。また、証明書は 90 日で切れるので再発行が必要ですが、再発行することにファイル名に含まれる数字が変わるため、本体の名前ではなくシンボリックリンクを設定に使います。

SSL/TLSの設定

ssl.confの編集

設定ファイルを次のように書き換えます。

vhost.confの編集

私はバーチャルホスト設定を使って複数のサイトを構成しているので、vhost.conf も編集します。

以前は一つの IP アドレスに対して証明書一枚だったようですが、SNI のおかげでホスト名ごとに発行することができるようになったらしいです。

ここまで書き換えたら Apache を再起動します。

これで https://example.com で接続できたら、ひとまず完了です。

HTTPSへの転送

www の有無に関する転送は vhost.conf でなんとかなりますが、HTTP から HTTPS への転送は .htaccess でやるしかなさそうです。

(参考)

証明書の自動更新

先ほど述べたように証明書は 90 日しか持たない、しかし手作業で毎回更新するのも大変であるということで自動で更新している人が多いようですが、ここで問題発生。上の方法だと certbot-auto がないぞ?と一瞬めんどくさくなりました。

ヘルプに載ってました。(一安心)

以下のコマンドでテストできます。

cron設定

Linux には cron 設定があるので、それを活用して自動実行というのがメジャーなようです。crontab で操作すればいいらしいことはわかりましたが、詳しい設定なんかは眠くてよく分かりません。動かなかったら頑張ります。

最後に

個人情報とか全くやり取りしない中でわざわざ SSL/TLS に適用させる意味があったのか。Google は対応済みのサイトを重視すると言ってはいるらしいですが、程度もよくわかりませんし、成果といえば少し勉強になったことくらいですね。

スポンサーリンク

コメント・質問する