2018/07/24(25?)のChrome68に備えて既存カスタムドメインのGitHub Pagesを常時SSL化 + digの使い方覚書

# そろそろやらねばと思ってたらもうこんな季節だった

- [「Chrome 68」から全HTTPサイトに警告表示へ--7月リリース - CNET Japan](https://japan.cnet.com/article/35114501/)
- [Chrome 68 リリース日について - Google プロダクト フォーラム](https://productforums.google.com/forum/#!topic/chrome-ja/ehnO7ZTq9xs)
- [Chrome Platform Status](https://www.chromestatus.com/features/schedule)

<img width="1325" alt="スクリーンショット 2018-07-19 23.29.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/24870/8aaf9d03-99cd-3348-16b7-a507b75acad6.png">


2018年7月にリリースされるChrome68からどんなページだろうがSSLじゃないと警告がでるようになるらしいというのはうろ覚えていたので、改めて具体的なデッドラインを参照したところ 2018/07/24 とのこと。ぼーっとしてたらもう日付が迫ってきていました...。日本時間を考慮するならforumの回答通り25日かなとは思ったものの、もはや尻に火がついた :fire:  状況でした。


# 状況と目標
- 状況
    - かなり昔にカスタムドメイン設定のされたGitHub Pagesがすでに存在する
    - まだEnforce HTTPS(強制SSLリダイレクト)の設定がOFF
    - DNS設定はお名前.comでやっている
- 目標
    - Enforce HTTPSの設定をONにする

# ちなみに公式が一番詳しいです
今回はちょっと慣れないdigコマンド周りでもたもたしたのでQiitaに書いておこうと思いました。
本当は公式を読んでおけば全然大丈夫です。貼っておきます。
https://help.github.com/articles/using-a-custom-domain-with-github-pages/

あとそもそもカスタムドメインをどうやるかなどは、既存のQiita記事が詳しいです。
- [GitHub Pagesで静的なサイトを公開し、独自ドメインを設定する - Qiita](https://qiita.com/tiwu_official/items/d7fb6c493ed5eb9ee4fc)
- [カスタムドメインの GitHub Pages で HTTPS を使う - Qiita
](https://qiita.com/superbrothers/items/95e5723e9bd320094537)

# DNS設定を更新する

そもそもGitHub PagesのリポジトリのSettingsを見に行ったところ、設定したのが昔すぎたので、警告が表示されていました。すみません...。

> The custom domain for your GitHub Pages site is pointed at an outdated IP address.


<img width="794" alt="スクリーンショット 2018-07-18 15.39.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/24870/c73f4579-a69a-7106-1386-365ba52bc127.png">


## お名前.comでDNS設定の更新

お名前.comにてDNS設定を確認すると、次のAレコードの設定を発見。これは古いIPアドレスのようです。

```
192.30.252.153
192.30.252.154
```

[公式help](https://help.github.com/articles/setting-up-an-apex-domain)には`ALIAS` と `ANAME` のレコード設定の方法も載っていますが、お名前.comではどちらも現時点で利用できなかったので、Aレコードを使った方法を採用しました。
一旦、古いIPアドレスは残しておいて、次の4つのIPアドレスを追加設定しました。

```
185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
```

## digコマンドで設定を確認

公式に正しく設定できたかdigで確認しましょう、という手順があったのですが、なぜか何も表示されず。
(example.comのところは実際は対象となるカスタムドメインを入力します)

```
$ dig +noall +answer example.com
(何もでない...)
```

ここで、 `+noall` `+answer` というオプションは `表示を全部消す` `ANSWER SECTIONだけ表示する　` を意味するので、一旦全部出してみます。
参考: [digコマンドで覚えておきたい使い方11個 | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2016/11/dig%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B911%E5%80%8B/)


```
$ dig example.com

; <<>> DiG 9.10.6 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: FORMERR, id: 28080
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; WARNING: EDNS query returned status FORMERR - retry with '+noedns'

;; QUESTION SECTION:
;example.com.			IN	A

;; Query time: 2 msec
;; SERVER: 192.168.100.1#53(192.168.100.1)
;; WHEN: Wed Jul 18 17:49:38 JST 2018
;; MSG SIZE  rcvd: 29
```

> ;; WARNING: EDNS query returned status FORMERR - retry with '+noedns'


FORMERRが出ていて、 `+noedns` をつけてリトライせよとのことのようです。
EDNSとはDNSの拡張プロトコルのことで、拡張プロトコル使ってみたけどエラーになったので無効化してリトライしなさい、という意味だと取りました。
参考: [インターネット用語1分解説～EDNS0とは～ - JPNIC](https://www.nic.ad.jp/ja/basics/terms/edns0.html)

```
$ dig example.com +noedns

; <<>> DiG 9.10.6 <<>> example.com +noedns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49238
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4

;; QUESTION SECTION:
;example.com.			IN	A

;; ANSWER SECTION:
example.com.		1054	IN	A	93.184.216.34

;; AUTHORITY SECTION:
example.com.		689	IN	NS	a.iana-servers.net.
example.com.		689	IN	NS	b.iana-servers.net.

;; ADDITIONAL SECTION:
a.iana-servers.net.	273	IN	A	199.43.135.53
a.iana-servers.net.	273	IN	AAAA	2001:500:8f::53
b.iana-servers.net.	146	IN	A	199.43.133.53
b.iana-servers.net.	146	IN	AAAA	2001:500:8d::53

;; Query time: 3 msec
;; SERVER: 192.168.100.1#53(192.168.100.1)
;; WHEN: Wed Jul 18 17:59:35 JST 2018
;; MSG SIZE  rcvd: 181
```

今度はちゃんと内容を得ることができました。ANSWERのみ抜粋もできます。

```
$ dig +noall +answer +noedns example.com

example.com.		1002	IN	A	93.184.216.34
```

というわけでこの設定で対象のドメインを見てみると、次のように旧/新どちらのIPもちゃんと確認できました。
(*表記はexample.comと置換)

```
$ dig example.com +noedns +noall +ans

; <<>> DiG 9.10.6 <<>> lo-upe.com +noedns +noall +ans
;; global options: +cmd
example.com.		240	IN	A	185.199.108.153
example.com.		240	IN	A	185.199.109.153
example.com.		240	IN	A	185.199.110.153
example.com.		240	IN	A	185.199.111.153
example.com.		240	IN	A	192.30.252.153
example.com.		240	IN	A	192.30.252.154
```


# GitHubに出ている古いですよ！の警告文に対応

設定はできている様子であるものの、まだ `outdated IP address` の警告文は表示されたままになった状態です。

https://help.github.com/articles/setting-up-an-apex-domain/

> If you're updating the IP address of an existing A record, first remove and then re-add your custom domain to the repository you’re using to publish your Pages site to trigger the process of enabling HTTPS.

公式helpに従って、Custom domain の項目のinput欄を空にしてSave -> 再度ドメインを入力してSave で警告文は消えました。
警告文がなくなったことを確認し、古いIPアドレス `192.30.252.153` と `192.30.252.154` には引退してもらいました :wave: 

# 強制SSLリダイレクトできるようにする

警告とdigの件がなければ、実際のところ常時SSLのために必要なのはこのステップだけです。クリックひとつのために長い道のりだったな...。


<img width="800" alt="スクリーンショット_2018-07-18_17_11_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/24870/57bf1a19-21bf-3f03-4a5b-db37e631f68a.png">

Enforce HTTPS のチェックボックスをONにします。
ONにしてからしばらく後(10分後くらい)に確認してみると、http://~ でアクセスして https://~ へリダイレクトする挙動を観測することができました。
これで無事Chrome68を安心して待つことができそうです。めでたしめでたし。