Kntmrkm.new

WEB技術のメモ

Herokuで無料のSSL設定とLet'sEncrypt

ドメインの準備

example.comなどのルートドメインでherokuのアプリにアクセスするために、 S3にリダイレクトするためのバケットを作り、Route53のAレコードの設定でTargetをS3バケットとする。

example.comにアクセスするとwww.example.comにリダイレクトされる。

Macでの準備

collectiveidea.com

brew install certbot

ローカルでマニュアル設定する場合は以下のように開始する。

sudo certbot certonly --manual

sudo certbot certonly --manual -d www.example.com(登録するサーバのFQDN)

Make sure your web server displays the following content at
http://www.example.com/.well-known/acme-challenge/xxxxxxxxxxxxxxxxx before continuing:

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s" yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy > .well-known/acme-challenge/xxxxxxxxxxxxxxxxx

# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"
Press ENTER to continue

xxxxxxxxxxxxxxxxxLETSENCRYPT_REQUESTとして、 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyLETSENCRYPT_RESPONSEとして登録する。

Railsで応答する場合の設定

ルーティング

get '/.well-known/acme-challenge/:id' => 'pages#letsencrypt'

コントローラ

force_sslを行わないようにする。 ApplicationControllerでは、force_sslを実行して、pagesでは実行しない。

force_ssl if: :use_ssl?

private

    def use_ssl?
      Rails.env.production?
    end

# PagesController
private

    def use_ssl?
      false
    end
  def letsencrypt
    if params[:id] == ENV["LETSENCRYPT_REQUEST"]
      render text: ENV["LETSENCRYPT_RESPONSE"]
    end
  end

証明書作成後

Press ENTER to continue

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2016-12-11. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

上記のような出力が出たら成功となる。

HerokuのFree SSL Beta

blog.heroku.com

  • heroku labs:enable http-sni --app <app name> => もういらない
  • heroku plugins:install heroku-certs -> もういらない

heroku certs:add /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem --app <app name>