Code Serendipity

Keyword: Ruby, Python, javascript, RoR, heroku, AWS...

Code Serendipity

Keyword: Ruby, Python, wordpress, javascript, AWS...

herokuをletsencrypt使って無料で簡単にSSL化しよう

https://www.upcloud.com/support/wp-content/uploads/2016/01/Lets-Encrypt-1024x410.png

heroku のSSL化の記事はたくさんあるが、とにかく正確な「最新」の日本語情報がすくない。あとローカルでやる作業か否かがわかりにくい。なので、需要あるかと思い記事にします。

※ heroku でSSLを使用するには$20/month のアドオンSSL endpointを使わなくてはいけなかったが、 現在は、Freeプラン以外のプラン(hobby $7 ~ )で、SSL使用が無料になった。

certbotのインストール(ローカル環境)

これはいくらでもやり方が出てくるのでそれで入れるだけ。macならbrewとか ( brew install certbot)

Let's EncryptをHerokuにあるRailsアプリに適用する(2016/9月版) - Qiita

証明書をletsencryptで発行(ローカル環境)

config/routes.rb で/.well-known/acme-challenge/:idで指定されたテキストを返すページに行くようにルートを設定。

Rails.application.routes.draw do
  get '/.well-known/acme-challenge/:id' => 'static_pages#certbot'

 
end

コントローラで

def certbot
    id = ENV['LETS_ENCRYPT_ID']
    secret = ENV['LETS_ENCRYPT_SECRET']

    if id.nil? || secret.nil?
      render_404 and return
    end

    unless id == params[:id]
      render_404 and return
    end

    render text: "#{id}.#{secret}"
  end

これをgit push heroku … .で反映させる。

(heroku config:set でセットできるよう)環境変数にしておくと、3ヶ月ごとの更新のときいちいちgit push しなくていいので便利。

この環境変数に入る値は、あとでcertbotから指定される。

用意ができたら

mkdir certbot
certbot certonly --manual -d www.example.com --logs-dir certbot --config-dir certbot --work-dir certbot

を実行して、 * email(更新通知などが来る) や

を質問に答えながら指定していくと、 最後にこのURLにアクセスしたらこの変数を返せ、というのが表示されるのでそれを

ENV['LETS_ENCRYPT_ID']
ENV['LETS_ENCRYPT_SECRET']

に設定してあげる(ローカルから出来る)。(BASICやSSL設定を一時的にオフにしてあげるとよい)

うまくいけばその後、証明書を取得できる。

Congratulations!
Generating key /dir/working_dir/certbot/live/www.example.com/fullchain.pem

といったメッセージが表示される。certbot/live/www.example.com/のしたに、 fullchain.pemとprivkey.pemが作られる

herokuに設定(ローカルからできる)

※他のサイトにはあるかもしれないが、heroku SSL はもうbetaでないので、labs:enableといったコマンドを打つ必要はない

heroku certs:add /etc/letsencrypt/live/www.example.com/fullchain.pem /etc/letsencrypt/live/www.example.com/privkey.pem

その後、ドメインDNS設定どうこうが出て来る。 これは説明に従えば良いだけ。CNAME 設定を変える。

Resolving trust chain... done
Adding SSL certificate to ⬢ your-app... done
Certificate details:
Common Name(s): example.com
Expires At:     xxxx-xx-xx xx:xx UTC
Issuer:         /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Starts At:      xxxx-xx-xx xx:xx UTC
Subject:        /CN=www.example.com
SSL certificate is verified by a root authority.

=== Your certificate has been added successfully.  Update your application's DNS settings as follows
Domain                    Record Type  DNS Target
────────────────────────  ───────────  ──────────────────────────────────────
www.example.com               CNAME       www.example.com.herokudns.com

あとはHTTPS監視とかやっておくと良いと思います。

savamoni.com

engineer.crowdworks.jp

更新

certbot/ ディレクトリ配下に移動。ディレクトリ名などは各自の環境に合わせてください。

certbot renew -q --no-self-upgrade --logs-dir certbot --config-dir certbot --work-dir certbot

参考

blog.kakeragames.com