Let’s Encryptがパブリックベータ版に移行したというのがニュースになったとき、管理しているサイトの1つ(stingrays.tokyo)を使って試してみようかなぁと思ったものの、いろいろ忙しかったのもあり早2ヶ月が経ってしまったが、FacebookのTLでちょうど環境が一致するチュートリアルのブログポストを見つけたので、本家のドキュメントを読みつつ手を動かしてみた。
去年の12月に結論を先に言うと、ちょっとつまづいたけど簡単にできた。
まず、サーバー環境に関して前提条件がいくつかある。
- サーバーに非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が実現できたわけである。