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を導入するサーバー環境はこちら。
項目 | バージョン |
---|---|
OS | CentOS 6.x |
Apache | 2.2.x |
またサーバーは次のような状態で稼働させている。
- オレオレ証明書をすでに使っている
- 443ポートは解放済み
- バーチャルホストで運営している
この記事で説明する操作は、すべてSSLで行っっている。また、ユーザーはスーパーユーザーで、/root ディレクトリで作業したものである。
curlのアップデート
今回いろいろプログラムをインストールしていくが、curlが古いとうまくいかないので事前にアップデートしておこう。
$ yum update curl
Certbotの設定、httpsでアクセスできるようにする
Let's encryptを簡単に管理できるようにしてくれるプログラムが Certbot である。
とりあえずhttpsでアクセスできるようにするまでの手順は次の通り。
- certbotをダウンロード
- Apacheを停止
- certbotを使って鍵を作成
- Apacheに鍵のパスを記述
- Apacheを再起動
それでは手順を追って説明してく。
Certbotのインストール
Certbotをgitでクローンする。$ git clone https://github.com/letsencrypt/letsencrypt
Apacheを停止
Apacheを止めないと証明書を作れないので、作業する前に停止しておく。
$ /etc/rc.d/init.d/httpd stop
Certbotを使って鍵を作成
先ほどクローンした letsencrypt ディレクトリへ移動する。letsencrypt-auto コマンドがあるので、それを使って鍵を作っていく。hogedomain.com の部分は自分のサーバーのドメインに置き換える。
$ ./letsencrypt-auto certonly -a standalone -d hogedomain.com
鍵を作るにあたって、いくつか質問されるが難しいことはないのでここでは省略する。さて、これで /etc/letsencrypt/live/hogedomain.com/ 内に鍵が作られたと思う。
$ ls /etc/letsencrypt/live/hogedomain.com/
README cert.pem chain.pem fullchain.pem privkey.pem
Apacheに鍵のパスを記述
さきほどの鍵の場所を、Apacheの ssl.conf に記述する。
$ 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を再起動しよう。
$ /etc/rc.d/init.d/httpd start
自分のドメインにhttpsでアクセスできるか確認しよう。証明書もLet's Encryptとなっているはずだ。
サブドメインでもLet's Encryptを使えるようにする
サブドメインでもSSLを使えるようにしたい場合は、さきほどの鍵をサブドメイン毎に作り、設定してあげる必要がある。まずは、サブドメインの鍵をつくろう。
$ ./letsencrypt-auto certonly -a standalone -d sub.hogedomain.com
そしてApacheのvirtualhost.confを次のように書き換えた。
$ 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コマンドで証明書を更新できるようになっている。
しかし、実際行ったところこのプログラムはpython2.7系でないとうまく動作しなかった。なので、Centos6でPython2.7を使えるようにしていく。
Centos6でPython2.7を使えるようにするまで
CentOS6のyumではPython2.6までしかサポートされていない。Python2.7を使えるようにするにはSCLを使うことになる。SCLとは、サポートされていないアプリケーションを実行可能なようにしてくれるものつぎのコマンドでインストールしておこう。
$ yum install centos-release-scl-rh
さらにPython2.7もインストールする。
$ yum -y install python27
実際に使うときはこんな感じ。
$ scl enable python27 '実行したいプログラム'
自動更新の設定
$ scl enable python27 './certbot-auto renew'を実行して証明書が更新されるかテストする。証明書を更新する場合はApacheを停止しておくことをお忘れなく。問題なければcronに登録して自動更新させていく。$ 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の自動更新がうまくできなかった場合は、とりあえずエラーログを確認してみよう。
$ cat /var/log/letsencrypt/letsencrypt.log