去年の12月にLet’s Encryptがパブリックベータ版に移行したというのがニュースになったとき、管理しているサイトの1つ(stingrays.tokyo)を使って試してみようかなぁと思ったものの、いろいろ忙しかったのもあり早2ヶ月が経ってしまったが、FacebookのTLでちょうど環境が一致するチュートリアルのブログポストを見つけたので、本家のドキュメントを読みつつ手を動かしてみた。
結論を先に言うと、ちょっとつまづいたけど簡単にできた。
まず、サーバー環境に関して前提条件がいくつかある。
- サーバーに非root権限でターミナルに接続(SSHなど)できること
- sudoなどでroot権限での実行が可能であること
- インターネット上に公開されている(DNSで名前解決できる)稼動中のWebサーバーであること
上記の質問で1つでも答えがノーならば、ここでおしまい。
基本的に共用レンタルサーバーとかでは使えない。
ちなみに今回使った環境は、さくらVPS上のUbuntu Server 14.04.3 LTS + Apache 2.4.7で、証明書がなかったのでHTTPだけで運用していたサーバー。
では早速Let’s Encryptをインストールしてみよう。と言っても、apt-get installでのインストールではなく、単にGitHubからソースをgit cloneするだけ。
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
インストール先は/optにしたが、好みの問題でもあるので、別に/usr/localの下とかでも構わない。
Let’s EncryptはGitHub上で開発途上なんで、直近のリリースタグで固定しておいた方が安心かも。
$ cd /opt/letsencrypt $ sudo git co -b v0.3.0 v0.3.0
続いてLet’s Encryptクライアントを介してサーバー証明書のインストールをする。
$ ./letsencrypt-auto --apache -d stingrays.tokyo
が、エラー発生…。
Domains: stingrays.tokyo Error: The server could not connect to the client for DV
ネットで同じエラーを探してみたら、「Let’s EncryptのCAが証明書のインストール先になるWebサーバーの名前解決できてないんじゃね?」という回答が多かったが該当せず。
HTTPのみで運用しているというのが原因で、自己署名証明書でもいいからとりあえずHTTPSでアクセスできるようにしておかないといけなかった。
$ sudo a2enmod ssl $ sudo a2ensite default-ssl $ sudo service apache2 restart $ curl -kI https://localhost HTTP/1.1 200 OK (略)
HTTPSでのアクセスはOK!
気を取り直してletsencrypt-autoを再実行するも失敗…ここがつまづいた部分。
curlだけでHTTPSにつながることを確認したけど、手元のブラウザで確認するのを怠っていた。ブラウザからHTTPSでつながらない…ってことは、今までHTTPオンリーで運用していたからiptablesで穴が開いてなかったというオチ。
改めてletsencrypt-autoを再実行!通った!
letsencrypt-autoは非root権限で実行しているのに、rootじゃないと編集できない/etc/apache2配下の設定ファイルが書き換わるのはなぜだろう?直近でsudoしてたからプロンプトしなかっただけ?
Let’s Encryptがどう設定を書き換えるのか気になる人は、/etc/apache2配下をgitで管理するといいでしょう。
$ cd /etc/apache2 $ sudo git init $ sudo git add . $ sudo git ci -m 'Initial config'
letsencrypt-autoの実行後にgit diffすれば変更点が一目瞭然。
ちなみに、Apache2の場合、/etc/letsencrypt/options-ssl-apache.confというファイルができあがり、mod_ssl用の推奨設定みたいなのが含まれているので、実際に運用している設定で欠けている部分があったらコピペして補完しとくといいでしょう。
これでLet’s Encryptの無料SSL証明書を使ってHTTPSがサービスできるようになったわけだ。

SSL Reportでも正常なHTTPS通信ができているという確認ができる(自分のサイトで試してください)。
めでたしめでたし…ではなく、Let’s Encryptの証明書の有効期間は90日しかないので、証明書が期限切れになる前に都度更新(Renew)しなければならない。現時点ではLet’s Encryptから証明書を自動更新する仕組みは提供されていないようだが、冒頭で紹介したブログポストで便利なシェルスクリプトを公開してくれていた。
$ sudo curl -L -o /usr/local/sbin/renew-letsencrypt http://do.co/le-renew $ sudo chmod +x /usr/local/sbin/renew-letsencrypt
短いスクリプトなので、中で何をやっているのかザッと目を通しておくといいだろう。
最後に、このスクリプトをcronで定期実行するように設定すればおしまい。
$ sudo crontab -e # 以下の1行を追記 0 3 1 */2 * /usr/local/sbin/renew-letsencrypt stingrays.tokyo >> /var/log/renew-letsencrypt.log
有効期間は90日だがバッファを設けて、偶数月の1日、つまり約60日間隔で更新処理が実行されるように仕込んでおいた。これで完全放置プレイで無料SSLが実現できたわけである。