便利な gem が出てきて、 Heroku でも気軽に設定できる、更に自動更新もできるようになったので、共有致します。
ほぼ gem の README のままですが、順番調整と注意ポイントもあります。
手順
- gem 追加
- Heroku 環境変数追加
- SSL証明書生成
- Heroku Scheduler 自動更新設定追加
1. gem追加
- gem 追加して、
bundle install
を実行する
gem 'platform-api', github: 'jalada/platform-api', branch: 'master'
gem 'letsencrypt-rails-heroku', group: 'production'
- 設定追加
config/environments/production.rb
Rails.application.configure do
...
config.middleware.use Letsencrypt::Middleware
...
end
Heroku への push を忘れずに
2. Heroku 環境変数追加
- Heroku Token 作成しておく
$ heroku plugins:install heroku-cli-oauth
$ heroku authorizations:create -d "LetsEncrypt"
Created OAuth authorization.
ID: <heroku-client-id>
Description: LetsEncrypt
Scope: global
Token: <heroku-token>
- Heroku 環境変数追加
heroku config:add ACME_DOMAIN=example.com,www.example.com ACME_EMAIL=admin@example.com HEROKU_APP=you_app_name HEROKU_TOKEN=上記で作成したtoken
3. SSL証明書生成
heroku run rake letsencrypt:renew
4. Heroku Scheduler 自動更新設定追加
# 毎月の1日が更新する
if [ "$(date +%d)" = 01 ]; then rake letsencrypt:renew; fi
注意ポイント
- 証明書を生成するステップの中、 Heroku 側へのリクエストは HTTP で来るので、対応が必要
- SSL導入したら、
config/environments/production.rb
でforce_ssl = true
を書きたいですが、上記の理由で、SSL証明書生成する時の(コールバックみたいな)URLだけ HTTP にする必要がある
Rails 4 のやり方
# application_controller.rb に追加
force_ssl if: :force_ssl?
private
def force_ssl?
not request.path =~ /^.well-known\/acme-challenge/
end
Rails 5 のやり方
# config/environments/production.rb
config.force_ssl = true
config.ssl_options = { redirect: { exclude: -> request { request.path =~ /^.well-known\/acme-challenge/ } } }
参考リンク:Rails 5 ssl_options