無料SSL証明書 Let's Encrypt を使ってサイトをSSL対応
久しぶりにこちらのブログを更新である。
VPS上で運用している私のページ https://smart-boy.org/ をSSL化してみた。
そのドメイン上のサイトはServersMan@VPS というレンタルサーバ(VPS)を使っているのだが、OSを自分でバージョンアップすると動作保証対象外となるのでずっと CentOS5 のままでいた。CentOS5 でSSL化をするのはできないわけではないが、結構めんどくさそうなので HTTPS が世の中の主流になってもSSL化せず HTTP のまま運用していた。
最近、ServersMan@VPS でもサーバを初期化してOSを変更する場合は動作は保証されるようなので、このたび思い切って初期化してサーバを再構築して CentOS7 とした*1。そこで、せっかくだから SSL化もすることとした。
無料SSL証明書 Let's Encrypt
SSL化といっても、個人サイトなのでサーバ証明書にはお金をかけたくない。というわけで無料のサーバ証明書を探しても、有効期間が短いものばかり。ところが、"Let's Encrypt"という無料SSL証明書は、有効期間は90日と短いものの、自動で更新できるツールがあるということで、この証明書を使用することにした。
ServersMan@VPS の CentOS7 で yum を実行する方法は?
この証明書の取得の準備のためには色々とインストールしなければいけないものがあるのだが、ServersMan@VPS の CentOS7 では、 yum を実行すると競合エラーが出て、思うようにインストールできない。Let's Encrypt に必要なものをインストールできないだけではなく、" yum update "を実行してサーバ上のモジュールを最新化しようとしても、半分ぐらいが競合エラーではじかれる。この時点で悪戦苦闘。
CentOS7 yum update 後、VPSサーバーにアクセスができなくなった- FAQ | 会員サポート:ユビキタスプロバイダ DTI
これを見る限り、サーバに繋がらなくなる不具合があり、 initscripts の update を無効化しているようである。しかし、ServersMan@VPSでのHTTPS対応 | keitark を読んだところ、更新しても大丈夫そうだった。そこで、 /etc 直下にある yum.conf の、" exclude=initscripts* " と書かれた行をコメントアウトして、 yum を実行した。
Let's Encrypt で複数サイトのSSL証明書の取得・設定
ようやくSSL証明書を入手するまでの準備が整ったので、以下のページを参考にして、証明書を取得した。
私はそのサーバ上でサブドメインを分けて3つのサイトを運営しているのであるが、その同一ドメインにある3つのサイトの証明書を1つにまとめて取ることができた。
複数サイトをまとめて取得する際に注意しなければいけないのが、
certbot certonly --webroot -w /var/www/wordpress -d smart-boy.org -w /var/www/horselink -d horselink.smart-boy.org -w /var/www/wikikeiba -d wikikeiba.smart-boy.org
このように、 -d オプション(ドメイン名)だけではなく、 -w オプション(ドキュメントルート)もサイト分指定しなければいけないということである。
認証局でサイトの存在確認をする際に、サーバ上で実行する証明書要求用のモジュール(certbot)がドキュメントルート上に仮のフォルダとファイルを作成し、認証局側でそこに HTTP でアクセスして、アクセスできた場合に証明書を発行する仕組みだからである*2。
これで無事SSL証明書の取得ができたので、 Apache の設定に証明書のパスを書き込んで Apache 再起動。これで、SSL化が完了した。
Wordpress で CSSが読み込まれない現象への対応
と思ってアクセスしてみると、「安全なサイト」として表示はされるのだが、 Wordpress で作成したページの CSS が読み込まれていない。こういう現象が起きたが、WPのプラグイン " Really Simple SSL " *3を入れて、「混合コンテンツ修正」を ON にしたら正常に表示されるようになった。
Let's Encrypt の自動更新設定
あとは自動更新の設定だが、以下のページの方法がシンプルでわかりやすかったので参考にした。
これで(たぶん)有効期間が切れそうになると自動更新される筈。