ちょっとした SSL 対応のサイトを用意したい事案が発生したので、今まで気になっていたけどよく知らなかった Let’s Encrypt を試してみました
やりたいこと
- http://www.example.com のサイトを https://www.example.com でアクセスできるようにする
- SSL 証明書に Let’s Encrypt を使用する
なお、試した環境は下記の通りです。
- Cent OS 6.3
- Apache 2.2.15
- www.example.com は VirtualHost で運用
Let’s Encrypt のインストール
インストール
まずは、Let’s Encrypt のインストールから。
$ git clone https://github.com/letsencrypt/letsencrypt $ cd letsencrypt $ ./letsencrypt-auto --help
なお、letsencrypt-auto コマンドのタイミングで依存パッケージをインストールするため yum update が実行されるようです。
自分の環境の場合、インストール中にエラーが出てしまいました。
./letsencrypt-auto: line 460: virtualenv: コマンドが見つかりません
python の実行環境を管理する virtualenv というツールが必要だそうです。
virtualenv について調べていたら、どうも Python を今入っている 2.6 から 2.7 にバージョンアップしないとダメそうな模様。
というわけで先に Python のバージョンアップをします。
# 現在のバージョン確認 $ python -V Python 2.6.6 # SCL(Software Collections)をインストール $ sudo yum install centos-release-SCL # Python 2.7 と scl-utils をインストール $ sudo yum update $ sudo yum install scl-utils python27 python27-scldevel # Python 2.7 を有効化 $ scl enable python27 bash # バージョンアップされたことを確認 $ python -V Python 2.7.5
Let’s Encrypt のインストールを再開します。
$ ./letsencrypt-auto --help
またエラーが出ました。python のライブラリが見つからない、といった内容のようです。
/path/to/.local/share/letsencrypt/bin/python2.7: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
libpython2.7.so.1.0 のシンボリックリンクを /lib64 下に作ります。
$ which python /opt/rh/python27/root/usr/bin/python $ ldd /opt/rh/python27/root/usr/bin/python linux-vdso.so.1 => (0x00007fff5f5ff000) libpython2.7.so.1.0 => /opt/rh/python27/root/usr/lib64/libpython2.7.so.1.0 (0x00007f49e8ad1000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f49e88ab000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f49e86a7000) libutil.so.1 => /lib64/libutil.so.1 (0x00007f49e84a4000) libm.so.6 => /lib64/libm.so.6 (0x00007f49e821f000) libc.so.6 => /lib64/libc.so.6 (0x00007f49e7e8b000) /lib64/ld-linux-x86-64.so.2 (0x00007f49e8e95000) $ sudo ln -s /opt/rh/python27/root/usr/lib64/libpython2.7.so.1.0 /lib64/
Let’s Encrypt のインストールを再開します。
$ ./letsencrypt-auto --help
今度はインストールできました。
SSL証明書作成
次に SSL 証明書を作成します。
Apache が起動しているとエラーが起きるようなので一旦停止します。
$ sudo /etc/rc.d/init.d/httpd stop
www.example.com ドメインの証明書を作成します。
$ ./letsencrypt-auto certonly -a standalone -d www.example.com
コマンド実行後、メールアドレスの入力画面、利用規約の同意画面が出るのでそれぞれ入力して進みます。
最後に以下のようなメッセージが表示されます。SSL証明書が作られたようです。
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.example.com/fullchain.pem. Your cert will expire on 2016-07-07. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.
表示されたメッセージにあるディレクトリの中を確認します。
$ sudo ls /etc/letsencrypt/live/www.example.com/ cert.pem chain.pem fullchain.pem privkey.pem
Apache の設定
$ sudo vi /etc/httpd/conf.d/ssl.conf # 下記記述を設定 SSLCertificateFile /etc/letsencrypt/live/www.example.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/www.example.com/chain.pem
$ sudo vi /etc/httpd/conf.d/vhost.conf # 下記記述を設定 NameVirtualhost *:443 <VirtualHost *:443> ServerName www.example.com DocumentRoot /path/to/www.example.com SSLEngine on SSLCertificateFile /etc/letsencrypt/live/www.example.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/www.example.com/chain.pem </VirtualHost>
Apache を起動します。
$ sudo /etc/init.d/httpd start
ブラウザからサイトにアクセスしました。ちゃんと SSL が設定できたようです。
Let’s Encrypt の自動更新設定
Let’s Encrypt の証明書は有効期限が3ヶ月という制限があります。期限が来る度に更新するのは大変なので、自動更新処理を設定します。
0 3 1 * * /etc/init.d/httpd stop; /path/to/letsencrypt/letsencrypt-auto certonly -a standalone -d labo.go-sign.info --renew-by-default; /etc/init.d/httpd start
root の cron に、毎月1日3時に自動更新処理が行われるようにしてみました。
感想
使ってみるまでは無料という表面的な特徴しか把握してませんでしたが、それ以上に業者と面倒なやり取りすることもなくコマンドラインで操作が完結する手軽、思い立ったらすぐに証明書を取得できるスピード感、といった使い勝手の良さにとても驚きました。とっても素晴らしいサービスですね。