CentOSにLet's Encryptを導入して自動更新するやり方

CentOSにLet's Encryptを導入して自動更新するやり方
CentOSにLet's Encryptを導入して自動更新するやり方

Googleが推奨しているように、だんだんSSLは必須な世の中になってきた。しかし趣味でホームページをやっていたりする人にとっては、有料のSSLを導入するのはハードルが高いだろう。そんな中、無料で使えるSSLが登場した。その名も「Let's Encrypt」。

「Let's Encrypt」はありがたいことに無料で使える。ただし、1つ注意しなければならない。それは3か月に一度、SSLの更新を行う必要があること。しかし、それもツールを使えば簡単に更新できる。

この記事では「Let's Encrypt」を導入し、自動更新するまでの手順を詳しく解説していく。

CentOSにLet's Encryptを入れた環境

Let's Encryptを導入するサーバー環境はこちら。

項目バージョン
OSCentOS 6.x
Apache2.2.x

またサーバーは次のような状態で稼働させている。

  • オレオレ証明書をすでに使っている
  • 443ポートは解放済み
  • バーチャルホストで運営している

この記事で説明する操作は、すべてSSLで行っっている。また、ユーザーはスーパーユーザーで、/root ディレクトリで作業したものである。

curlのアップデート

今回いろいろプログラムをインストールしていくが、curlが古いとうまくいかないので事前にアップデートしておこう。

shell
$ yum update curl

Certbotの設定、httpsでアクセスできるようにする

Let's encryptを簡単に管理できるようにしてくれるプログラムが Certbot である。

とりあえずhttpsでアクセスできるようにするまでの手順は次の通り。

  1. certbotをダウンロード
  2. Apacheを停止
  3. certbotを使って鍵を作成
  4. Apacheに鍵のパスを記述
  5. Apacheを再起動

それでは手順を追って説明してく。

Certbotのインストール

Certbotをgitでクローンする。
shell
$ git clone https://github.com/letsencrypt/letsencrypt

Apacheを停止

Apacheを止めないと証明書を作れないので、作業する前に停止しておく。

shell
$ /etc/rc.d/init.d/httpd stop

Certbotを使って鍵を作成

先ほどクローンした letsencrypt ディレクトリへ移動する。letsencrypt-auto コマンドがあるので、それを使って鍵を作っていく。hogedomain.com の部分は自分のサーバーのドメインに置き換える。

shell
$ ./letsencrypt-auto certonly -a standalone -d hogedomain.com

鍵を作るにあたって、いくつか質問されるが難しいことはないのでここでは省略する。さて、これで /etc/letsencrypt/live/hogedomain.com/ 内に鍵が作られたと思う。

shell
$ ls /etc/letsencrypt/live/hogedomain.com/
README  cert.pem  chain.pem  fullchain.pem  privkey.pem

Apacheに鍵のパスを記述

さきほどの鍵の場所を、Apacheの ssl.conf に記述する。

shell
$ vi /etc/httpd/conf.d/ssl.conf

## 以下のように書き換える
SSLCertificateFile /etc/letsencrypt/live/hogedomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hogedomain.com/privkey.pem

Apache 再起動

以上でLet's Encryptが導入できたので、停止していたApacheを再起動しよう。

shell
$ /etc/rc.d/init.d/httpd start

自分のドメインにhttpsでアクセスできるか確認しよう。証明書もLet's Encryptとなっているはずだ。

Let's EncryptのSSL証明書
Let's EncryptのSSL証明書

サブドメインでもLet's Encryptを使えるようにする

サブドメインでもSSLを使えるようにしたい場合は、さきほどの鍵をサブドメイン毎に作り、設定してあげる必要がある。まずは、サブドメインの鍵をつくろう。

shell
$ ./letsencrypt-auto certonly -a standalone -d sub.hogedomain.com

そしてApacheのvirtualhost.confを次のように書き換えた。

shell
$ vi /etc/httpd/conf.d/virtualhost.conf

##以下を追加
<VirtualHost *:443>
    ServerName sub.hogedomain.com
    DocumentRoot /somewhere/hogedomain/sub

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/sub.hogedomain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/sub.hogedomain.com/privkey.pem

    ErrorLog logs/sslvirtual_error_log
    CustomLog logs/sslvirtual_access_log combined env=!no_log
   NameVirtualhost *:443
</VirtualHost>

これでApacheを再起動すれば、httpsでサブドメインにアクセスできるようになっているはず。

.htaccessでhttpsへリダイレクト

ちなみに、httpでアクセスしても自動でhttpsへリダイレクトするようにするには .htaccess に次のように書くことで可能となる。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

faviconでエラー

ブラウザーが小さい警告表示を出している場合、faviconが原因の可能性がある。ブラウザーがfaviconをリクエストすため、faviconを設置していないとエラーを吐くのだ。解決方法として、適当にfaviconを設置すればエラーはなくなる。

自動更新の設定

最初に述べた通り、Let's Encryptは3か月しか有効期限がないので更新してあげる必要がある。certbot-auto renewコマンドで証明書を更新できるようになっている。

renewは、すべての証明書を更新するコマンド。--post-hookオプションで指定したコマンドは、renew後に実行される。ただし、renewは期限が迫らないうちは、実行がスキップされ、その場合はpost-hookも実行されない。

しかし、実際行ったところこのプログラムはpython2.7系でないとうまく動作しなかった。なので、Centos6でPython2.7を使えるようにしていく。

Centos6でPython2.7を使えるようにするまで

CentOS6のyumではPython2.6までしかサポートされていない。Python2.7を使えるようにするにはSCLを使うことになる。SCLとは、サポートされていないアプリケーションを実行可能なようにしてくれるものつぎのコマンドでインストールしておこう。

shell
$ yum install centos-release-scl-rh

さらにPython2.7もインストールする。

shell
$ yum -y install python27

実際に使うときはこんな感じ。

shell
$ scl enable python27 '実行したいプログラム'

自動更新の設定

$ scl enable python27 './certbot-auto renew'を実行して証明書が更新されるかテストする。証明書を更新する場合はApacheを停止しておくことをお忘れなく。問題なければcronに登録して自動更新させていく。
shell
$ vi /etc/cron.d/letsencrypt

00 04 15 * * /etc/rc.d/init.d/httpd stop && scl enable python27 '/usr/bin/certbot-auto renew' && /etc/rc.d/init.d/httpd start

ちなみにcronの記述は、分 時 日 月 曜日 <実行コマンド>となる。

以上でCentOSにLet's Encryptを入れて自動更新できるようにするまでの説明を終わるが、Let's Encryptの自動更新がうまくできなかった場合は、とりあえずエラーログを確認してみよう。

shell
$ cat /var/log/letsencrypt/letsencrypt.log

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム