2016-03-24

Let's EncryptでHerokuアプリを独自ドメインSSL化

Let's EncryptをHerokuアプリに適用して、独自ドメインSSL化してみました。言語はPHPで。

herokuアプリ作成&設定

$ mkdir {PROJECT_NAME}
$ cd {PROJECT_NAME}
$ touch index.php
$ mkdir -p .well-known/acme-challenge # acme chellange用のディレクトリ作成
$ git init
$ git add .
$ git commit -m "init"
$ heroku apps:create {APP_NAME}
$ git push heroku master
$ heroku domains:add {DOMAIN_NAME} # ドメイン追加

このあと、DNSに{APP_NAME}.herokuapp.comへのCNAMEレコードを登録します。

Let's Encryptのインストール&設定

適当なディレクトリで以下を実行
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help
$ ./letsencrypt-auto certonly --manual --email {CONTACT_EMAIL} -d {DOMAIN_NAME}

以下のようなプロンプトが表示されます。

Make sure your web server displays the following content at
 http://{DOMAIN_NAME}/.well-known/acme-challenge/vh0lGRcn8--W-FI6xu32jtyL-khoTs8Uxcu7Ok_3j9A before continuing:
vh0lGRcn8--W-FI6xu32jtyL-khoTs8Uxcu7Ok_3j9A.mHMb6zTz8E2oKGjuKce-X1j9a0eYc-KNyA9l0Cq53jM
If you don't have HTTP server configured, you can run the following
 command on the target server (as root):
mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
 cd /tmp/letsencrypt/public_html
 printf "%s" vh0lGRcn8--W-FI6xu32jtyL-khoTs8Uxcu7Ok_3j9A.mHMb6zTz8E2oKGjuKce-X1j9a0eYc-KNyA9l0Cq53jM > .well-known/acme-challenge/vh0lGRcn8--W-FI6xu32jtyL-khoTs8Uxcu7Ok_3j9A
 # 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

この状態になったら、Heroku上でacme challengeを行うために、herokuアプリにファイルを置きます。(上のprintfをコピペでOKです)

$ cd {APPLICATION_DIRECTORY}
$ printf "%s" {CHALLENGE_CODE} > .well-known/acme-challenge/{CHALLENGE_CODE_FILE}
$ git add .
$ git commit -m "add challenge"
$ git push heroku master

あとはPress ENTERのプロンプト上でEnterを押下します。成功時は以下のような結果が表示されます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
 /etc/letsencrypt/live/{DOMAIN_NAME}/fullchain.pem.
 Your cert will expire on 2016-06-21. To obtain a new version of the
 certificate in the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

SSL登録

Heroku側にSSLの設定を行います。
$ heroku addons:create ssl:endpoint
$ heroku certs:add /etc/letsencrypt/live/{DOMAIN_NAME}/fullchain.pem \
  /etc/letsencrypt/live/{DOMAIN_NAME}/privkey.pem

証明書を設定した時点でCNAMEの向き先が{APP_NAME}.herokuapp.comから変わるので、DNSサーバの設定も変更する必要があります。

参考URL

このエントリーをはてなブックマークに追加