2017/02/03 に heroku certs + Let's Encrypt + Rails で証明書を更新したら意図せぬエラーで悩まされた件

# heroku certs コマンド
証明書が切れそうなので update することで証明書を最新にしようかなと思って実行していたんですが、意図せぬエラーによって時間がかかってしまったので、似たような事で躓かないように書き残しておきます。

# 前提
- heroku
- Let's Encrypt (後に git pull して最新に)
- Ruby on Rails 4.2
- 既に http://qiita.com/kon_yu/items/302d8bc0924f292d378b と似た構成で証明書作成済み  

# Let's Encrypt による証明書の更新

http://qiita.com/kon_yu/items/302d8bc0924f292d378b

上記の記事を参考に実行。

```
$ cd ~/letsencrypt/
$ git pull origin master
$ sudo certbot certonly --manual -d YOURDOMAIN
```

途中、certbot の指示に従って heroku 上で `LETSENCRYPT_REQUEST` と `LETSENCRYPT_RESPONSE` を設定。

設定後、

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem. Your cert will expire
   on 2017-05-04. 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
```

と出たので Let's Encrypt での証明書の取得は完了。

# heroku certs で証明書をアップロード(問題はここ)

```
$ sudo heroku certs:update /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem /etc/letsencrypt/live/YOURDOMAIN/privkey.pem -a APPID
▸    Must pass --name when more than one endpoint
```

このエラーをググっても有効な回答がなく。

エンドポイントが複数ある場合…？

```
$ sudo heroku certs:update /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem /etc/letsencrypt/live/YOURDOMAIN/privkey.pem --name APPNAME -a APPID
 ▸    Record not found.
```

何したらわかるんだ…。

```
$ sudo heroku certs:update /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem /etc/letsencrypt/live/YOURDOMAIN/privkey.pem --help
Usage: heroku certs:update CRT KEY

update an SSL certificate on an app

 -a, --app APP       # app to run command against
 -r, --remote REMOTE # git remote of app to run command against
 --bypass            # bypass the trust chain completion step
 --endpoint ENDPOINT # endpoint to update
 --name NAME         # name to update

Example:

 $ heroku certs:update example.com.crt example.com.key
```

ここで、「ところで　certs のリストを見るコマンドって何か無いのかな」と思ったところで。

```
$ heroku certs -a APPID
Name              Endpoint                       Common Name(s)  Expires               Trusted  Type
────────────────  ─────────────────────────────  ──────────────  ────────────────────  ───────  ────────
hogehogeho-00000  (Not applicable for SNI)       YOURDOMAIN       2017-02-18 13:47 UTC  True     SNI
fugafugafu-00000   fugafugafu-00000.herokussl.com  YOURDOMAIN     2017-02-18 13:47 UTC  True     Endpoint
```

なるほど、 heroku が新しく SSL をタダで使えるようになった時に試したままだった。
`fugafugafu-00000` が名前っぽいのでその名前をつけて再実行。

```
$ sudo heroku certs:update /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem /etc/letsencrypt/live/YOURDOMAIN/privkey.pem --name fugafugafu-00000 -a APPID
Resolving trust chain... done
 ▸    Potentially Destructive Action
 ▸    This command will change the certicate of endpoint fugafugafu-00000 (fugafugafu-00000.herokussl.com) from ⬢ APPID.
 ▸    To proceed, type APPID or re-run this command with --confirm APPID
> APPID
Updating SSL certificate fugafugafu-00000 for ⬢ APPID... done
Updated certificate details:
Common Name(s): YOURDOMAIN
Expires At:     2017-05-04 05:00 UTC
Issuer:         /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Starts At:      2017-02-03 05:00 UTC
Subject:        /CN=YOURDOMAIN
SSL certificate is verified by a root authority.
```

これで良さそう。

# 確認
## 実施前の SSL 証明書
Google Chrome の開発者ツール `Security` タブから。
![image](https://qiita-image-store.s3.amazonaws.com/0/20733/83018eab-f724-a555-0f02-ab54d0f7fb39.png)

`View certificate` する。

![image](https://qiita-image-store.s3.amazonaws.com/0/20733/9ab35c59-464b-5729-2abc-e3a52fb962fc.png)

## 実施後
![image](https://qiita-image-store.s3.amazonaws.com/0/20733/7825dcbd-a02b-7a3f-9a7d-109f3e81bb99.png)

確認してみて OK。

# 残タスク
- あとで不要な証明書を削除する