shibuso.net

プログラミングとかゲームとか

Let's Encryptを利用してSSLを導入してみた

2017年05月09日 | タグ: 開発

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を導入するまでの大まかな手順でした。