Let's Encryptを利用してSSLを導入してみた
Let's Encryptが正式サービスを開始してからだいぶ経ちますが、ようやくこのブログにも導入してみました。前々から入れよう入れようと思っていたものの、基本サーバとかネットワークに疎いためどうにも億劫で先延ばしにしていました。もうあちこちに導入方法とかまとまっていますし結構簡単だったんですが、Ubuntu16.04でnginxを使っていて、それもパッケージを使って入れるという方法があまり見かけなかったので、備忘録も兼ねて書いてみます。
まず最初に参考にしたのはCertbotの公式ドキュメントです。nginxとUbuntu16.04の組合せについてはこちらのページに書かれていますが、ここでまず一つ問題が。ここに書かれているコマンドは私が見ている現時点では
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot
となっていますが、ここのadd-apt-repository
がPythonの環境が入っていないと実行できませんでした。そのため先に
$ sudo apt-get install software-properties-common python-software-properties
を実行しました。余談ですが、私は基本aptitude
を使っています。今回はapt-get
で書き換えていますが、aptitude
を使っている方は置き換えて考えてください。
さて、上記を一通り実行したらもうCertbotの導入は完了ですね。次はもう証明書の取得です。
$ sudo certbot certonly --webroot -w [ドキュメントルート] -d [ドメイン] --email [メールアドレス]
これで証明書の取得が可能です。ドキュメントルートはRailsだったらRailsルート/public
ですね。一つ気をつけたいのは、パッケージで導入した時のコマンドはcertbot
だということです。よくQiitaとかでcertbot-auto
で書かれたりしてますが、あれは恐らくソースをDLした場合のコマンドです。今回パッケージで導入したから違うわけですね、私はちょっと戸惑いました。
ここまで来ればあとはnginxの設定と証明書の更新の設定です。nginxの設定については
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/www.example.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
}
ここらへんを気をつければ大丈夫なはずです。さくらのナレッジの記事を参考にすると、80でアクセスしてきた場合のリダイレクト処理も書いてあげるとなお親切ですね。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
}
そして証明書の更新についてはrootユーザのcronに
0 5 * * 0 certbot renew --post-hook "service nginx restart"
こんな感じで設定しておくと良いかと思います。上記は毎週日曜日の午前5時に証明書の更新を試みる内容になっていますが、どうもこれを実行しても証明書の有効期限が一体期間以上残っていたら更新はしないようになっているようです。
以上が私がLet's EncryptでSSLを導入するまでの大まかな手順でした。