Heroku ACM で SSL を自動更新してみた 🔧

## 背景

- Let's Encryptで発行したSSL証明書が3月31日に切れる📴
- どうせ更新するなら、自動化したいなぁ🤔
- お、丁度いいタイミングでHerokuさんのプレスリリースが... :eyes: 

:new: __Automated Certificate Management__
https://devcenter.heroku.com/articles/automated-certificate-management

> With Automated Certificate Management (ACM), Heroku automatically manages TLS certificates for all apps that have __Hobby and Professional dynos__ on the Common Runtime. Certificates handled by ACM __automatically renew__ before they expire, and new certificates are __created automatically whenever you add or remove a custom domain.__ All applications with paid dynos include ACM for free.
> 
> 
> Automated Certificate Management uses [Let’s Encrypt](https://letsencrypt.org/), the free, automated, and open certificate authority for managing your application’s TLS certificates. Let’s Encrypt is run for the public benefit by the [Internet Research Security Group (ISRG)](https://letsencrypt.org/isrg/).

メッチャ便利そうなので使ってみよう...!! :wrench: :dash: 

![ACM Setup.png](https://qiita-image-store.s3.amazonaws.com/0/1857/f6dbd11f-47ec-f958-733f-eb81e4baaf06.png "ACM Setup.png")


## 今回、自動更新したドメイン

- [coderdojo.jp](https://coderdojo.jp/) ([GitHub](https://github.com/coderdojo-japan/coderdojo.jp))
- [railsguides.jp](https://railsguides.jp/) ([GitHub](https://github.com/yasslab/railsguides.jp))
- [yasslab.jp](https://yasslab.jp/) ([GitHub](https://github.com/yasslab/yasslab.github.io))

### 前提条件

1. :white_check_mark: Heroku上のアプリであること
2. :white_check_mark: Hobbyプラン以上にしていること
3. :white_check_mark: DNSを`herokudns`に向けていること

なお、自分の場合はいずれも下記で設定済みなので、あとはACMを有効化してみるだけでした :wrench:  :dash: 

PRで解説する、Jekyll + Heroku で HTTPS 対応
http://qiita.com/yasulab/items/d900bb47bf73beada855

## やってみた :wrench: :dash: 

現在の状態は `heroku certs:auto`で確認できます。

```bash
╭─○ yasulab ‹2.4.0› ~/coderdojo.jp
╰─○ heroku certs:auto

=== Automatic Certificate Management is disabled on coderdojo-japan
```

[2017年3月20日](https://devcenter.heroku.com/articles/automated-certificate-management#enable-automated-certificate-management)以前に作成したアプリケーションで、かつ、ACMをまだ設定していないければ、ACMは __disabled__ になっているはずです🤔

> __ACM is enabled by default for all applications created after March 21, 2017__ that are running on Hobby or Professional dynos.
> https://devcenter.heroku.com/articles/automated-certificate-management#enable-automated-certificate-management


Herokuのダッシュボードから Settings -> Configure SSL と辿ると、ACMを有効化することができます。

![ACM Configure.png](https://qiita-image-store.s3.amazonaws.com/0/1857/48978f1b-24a7-bf52-c0fd-316add85f6f1.png "ACM Configure.png")

問題なければ上記のように設定して Continue をクリック。ダッシュボード上では、自動更新の設定前はSSL証明書の期限が表示され、設定後は非表示になります。

ACM設定前:

![ACM disabled.png](https://qiita-image-store.s3.amazonaws.com/0/1857/388a9be9-7879-7fc0-5b57-73cc3791c622.png "ACM disabled.png")


ACM設定後: 
![ACM enabled.png](https://qiita-image-store.s3.amazonaws.com/0/1857/bbf4a237-6249-3336-1540-e86a6901018b.png "ACM enabled.png")

(📝 今回はダッシュボードから設定していますが、`heroku certs:auto:enable`でも設定できるようです)

設定後、再度`certs:auto`を実行すると `Waiting` になっていることが確認できます。

```bash
╭─○ yasulab ‹2.4.0› ~/coderdojo.jp
╰─○ heroku certs:auto 

=== Automatic Certificate Management is __enabled__ on coderdojo-japan

Domain            Status
────────────────  ───────
www.coderdojo.jp  Waiting
coderdojo.jp      Waiting
```

__2~3分__ 待つと、`In Progress`に。

```bash
╭─○ yasulab ‹2.4.0› ~/coderdojo.jp
╰─○ heroku certs:auto

=== Automatic Certificate Management is enabled on coderdojo-japan

Domain            Status
────────────────  ───────────
www.coderdojo.jp  In Progress
coderdojo.jp      In Progress
```

__45~60分__  ほどすると、`DNS Verified`になりました。

```bash
Domain            Status
────────────────  ────────────
www.coderdojo.jp  DNS Verified
coderdojo.jp      DNS Verified
```

:warning: `DNS Verified`は「証明書が更新された」という意味ではないので注意 (成功は `OK`)。 __したがって、この時点ではまだ証明書は更新できていません:__ 

```bash
╭─○ yasulab ‹2.4.0› ~/coderdojo.jp
╰─○ heroku certs:info

Fetching SSL certificate triceratops-84351 info for ⬢ coderdojo-japan... done

Certificate details:
Common Name(s): coderdojo.jp
Expires At:     2017-03-31 05:43 UTC
Issuer:         /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Starts At:      2016-12-31 05:43 UTC
Subject:        /CN=coderdojo.jp
SSL certificate is verified by a root authority.
```

> If your status says __“DNS Verified”, the process is not finished yet.__ It means we have verified your domain status and are still in the process of submitting it to Let’s Encrypt. The process will be complete when it says __“OK”.__
> https://devcenter.heroku.com/articles/automated-certificate-management#view-your-certificate-status

### 参考: 各ステーテスの意味

[![ACM Status.png](https://qiita-image-store.s3.amazonaws.com/0/1857/41250d69-7481-243c-947d-047af37eb5fb.png "ACM Status.png")](https://devcenter.heroku.com/articles/automated-certificate-management#view-your-certificate-status)


### 更新結果

`DNS Verified`からさらに30分ほど経つと、`OK`になりました。OKまでにかかる予想時間はドキュメントには書いていなかったので、もっと早かったり遅かったりするかもしれません🤔

```bash
╭─○ yasulab ‹2.4.0› ~/coderdojo.jp
╰─○ heroku certs:auto

=== Automatic Certificate Management is enabled on coderdojo-japan

Certificate details:
Common Name(s): coderdojo.jp
                www.coderdojo.jp
Expires At:     2017-06-28 00:48 UTC
Issuer:         /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Starts At:      2017-03-30 00:48 UTC
Subject:        /CN=coderdojo.jp
SSL certificate is verified by a root authority.

Domain            Status
────────────────  ──────
www.coderdojo.jp  OK
coderdojo.jp      OK
```

:memo: :point_up: ACMで自動更新されるようになると、`certs:info`を使わなくてもSSLの期限が表示されるようになりました。また、期限についても、 __Let's Encryptの上限である３ヶ月間延長されている__ ことが確認できます :new: :sparkles: 

cf. `certs:info`の実行結果:

```bash
╭─○ yasulab ‹2.4.0› ~/coderdojo.jp
╰─○ heroku certs:info

Fetching SSL certificate triceratops-84351 info for ⬢ coderdojo-japan... done

Certificate details:
Common Name(s): coderdojo.jp
                www.coderdojo.jp
Expires At:     2017-06-28 00:48 UTC
Issuer:         /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Starts At:      2017-03-30 00:48 UTC
Subject:        /CN=coderdojo.jp
SSL certificate is verified by a root authority.
```


最後に、SSL証明書が自動更新された後、ページが正常に表示されることを確認します :white_check_mark: :eyes: 

![CoderDojo Japan.png](https://qiita-image-store.s3.amazonaws.com/0/1857/715dafb8-d6ca-4b99-5190-d8f3098a554b.png "CoderDojo Japan.png")

以上です ;)
__SSLの自動更新がメッチャ簡単! Heroku すごいですね!__ 😆

## 宣伝 :loudspeaker: 

弊社 (YassLab) では[CoderDojo Japan](http://coderdojo.jp/)や[Railsガイド](https://railsguides.jp/)を始めとして、様々なOSSプロジェクトに貢献しています ;)

2017年度からRailsチュートリアルとRailsガイドの電子書籍版を出版しました! :closed_book: :orange_book: :sparkles: また、Railsチュートリアルの解説セミナーを収録した動画 (計34時間) も公開していますので、Railsを学びたい方はこちらもぜひ😸📹✨

- [Railsチュートリアル (電子書籍版)](https://railstutorial.jp/#ebook)
- [Railsガイド (電子書籍版)](https://railsguides.jp/options.html)
- [Rails解説セミナー (動画版)](https://railstutorial.jp/#screencast)


[![rails_seminar.png](https://qiita-image-store.s3.amazonaws.com/0/1857/eedc3b15-17b7-fd6b-fad6-6a98e68428f3.png "rails_seminar.png")](https://coedo-rails.doorkeeper.jp/events/59059)

[![logo-yasslab-copy.png](https://yasslab.jp/img/logo_800x200.png "logo-yasslab-copy.png")](http://yasslab.jp/)