Let's Encryptの証明書をGoogleAppEngineに設定して独自ドメインで運用する(Public beta)

待ちに待った[Let's Encrypt](https://letsencrypt.org/)のPublic betaが12月4日に来ました！！
急遽書く予定だったものを変更してGoogle App Engineに独自ドメインを設定するところからCustomSSLを設定するまでを書こうと思います！

# GoogleAppEngineとLet's Encryptとは

GoogleAppEngine(以後 GAE)はGoogleが提供しているPaaSで
Google.comやGmailと同じインフラで動かせるというのが特徴です。
なんで同じインフラで動かせるのかという説明は割愛しますが
つまりGoogle.comが落ちなければ落ちないサーバーを使えるということです。

そしてGAEは自動でスケールする仕組みがあるので突然の大量アクセスも予算内でインスタンスが増えて
アクセスが落ち着けばインスタンスの数は減るようになります。
そしてGAEは無料枠があるのでVPSと違い使われなければお金がかからないので
個人開発ではとってもいい遊び場所でもあります。

もちろん普通のサーバーではないのでGAE特有の制約などがありますが
それらを逆に使いこなすことでスケールのするサービスが作れます。

Let's Encryptは無料で使えるSSL証明書を発行してくれるサービスです。
DV証明というドメインの所有者であることを確認して取得できる証明書です。

無料のSSL証明書が取得できるだけなら一応は今までもあったのですが
Lets's EncryptはSSLの普及だけではなく証明書の自動更新をしてくれるACMEプロトコルの普及も目指しています。

自動更新になることで証明書の更新に人の手を使う必要がなくなるので運用の手間を省き、結果的にWebのSSL化が進むのではないかという期待があります。

今回紹介するのは手動での更新作業になりますので自動更新はできてません
GAEでも自動更新する良い手があるのか、もしくはGoogleが対応してくれるのを待つ形になると思います。

# 事前準備

ドメインを取得しておいてください
Googleのアカウントを作成しておきます
作業マシンにgcloudコマンドをインストールしておいてください
今回僕はMacBookで作業しています。
GoogleCloudPlatform(以後 GCP)のプロジェクトを作成しておいてください
課金設定はしておいてください

基本的には以下のAppEngine/Goのドキュメントを参考にしていただけると良いと思います。

https://cloud.google.com/appengine/docs/go/

HelloWorldをデプロイは済ませている前提です。

# カスタムドメインをCloud DNSで管理

GCPではDNSサーバーを提供しています。
Cloud DNSを使うことでRESTやコマンドラインからDNSを操作できるので自動化もしやすいので僕はこれを使ってます。

これは無料ではないのですが放置してるだけなら月0.02ドルほどでした。
２円くらいです。

ネットワーキング -> Cloud DNSに行き

ゾーンの作成でわかりやすい名前とドメインを登録します。
僕はムームードメインでドメインを取得してそれのネームサーバをGoogleに向けています。

# 証明書取得のためGoogleComputeEngineのインスタンスを使う

ここからが肝になります。
どうしても外部からアクセスできるマシンが必要だったので同じGCPのサービスであるGoogleComputeEngineを利用します。

これはマシンを借りれるIaaSです
自分でOSを操作できるので自由度は高いですが個人用途を想定してVPSと比べると高くなってしまうので常用は避けてます。(大学生だしお金ない)

ですが出た当初よりも価格もだいぶ下がっているし　少しの時間の起動だけでいいならプリエンプティブという２４時間以内のどこかで必ず停止するインスタンスがあり
それは通常の値段よりも大幅に安いので

今回の様なわずかな作業に最適なプランもあるので僕はGCPを利用しています。
あと立ち上がりも早いのでリクエストして３０秒以内にはログインができるようになるのも魅力の一つですね。

メニューのCompute Engine -> VMインスタンスに行き

インスタンスを作成で作成します

名前はわかりやすいのにしておきましょう lets-encryptとかで
リージョンはus-centralのどれかで
マシンタイプはf1-microで大丈夫です。
OSはDebianでHTTP トラフィックを許可するにチェックを入れてください
それと可用性ポリシーでプリエンプティブをオンにしておきましょう。
課金は最低１０分からで以降は１分単位で計算されます。


作成できたら外部IPをCloud DNSのAレコードに設定します。
そしてgcloudコマンドでsshログインします。

```bash
$ gcloud compute ssh $INSTANCE_NAME --zone $ZONE
```

INSTANCE_NAMEとZONEには作った名前とリージョンを入れてください。
ログインできたらgitを入れておきます。

```bash
$ sudo apt-get install -y git
```

クライアントをインストールします。

```bash
$ git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt
```

以下のコマンドでヘルプを表示しましょう。このコマンドを打つことで依存関係を解決するためパッケージのインストールが始まります。

```bash
$ sudo ./letsencrypt-auto --server \
https://acme-v01.api.letsencrypt.org/directory --help
```

次に証明書の作成コマンドです。
k2lab.netが証明書の欲しいドメインです。複数の場合は-dオプションを追加することで指定できます。

```bash
$ sudo ./letsencrypt-auto certonly -a standalone \
-d k2lab.net \
--server https://acme-v01.api.letsencrypt.org/directory
```

<img width="1116" alt="スクリーンショット 2015-12-06 2.49.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/15818/12581800-2c1f-3fb5-8d38-1a29c80ae8af.png">

emailは復旧用などに使われるそうです。

<img width="1116" alt="スクリーンショット 2015-12-06 2.49.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/15818/95e14a73-bb02-de45-8f74-bb593c9e2921.png">

利用規約に同意したらAgreeを押します。

作成に成功すると`/etc/letsencrypt/live/k2lab.net/`に証明書や秘密鍵があります。

これはシンボリックリンクですがここを参照することで自動で更新されても再起動するだけで証明書が更新されるという想定です。

今回使うファイルは`fullchain.pem`と`private.pem`です。

作成できたらGAEの設定に行きカスタムドメインでドメインを指定して
AレコードやAAAAレコードの設定をしておきましょう

設定が終わったら同じ設定の中にSSL証明書を設定する場所があるので
そこで新しい証明書をアップロードで追加します。

PEM でエンコードされた X.509 公開鍵証明書は`fullchain.pem`をコピペすれば大丈夫です。

復号化された PEM でエンコードされた RSA 秘密鍵は以下のコマンドで出力された物を貼り付けます。

```bash
$ sudo openssl rsa -inform pem -in privkey.pem -outform pem | less
```

これで https://k2lab.net にアクセスすればSSLが有効になってると思います！
しかもGoogleのサーバーだから当然HTTP2に対応してる！

<img width="878" alt="スクリーンショット 2015-12-06 4.22.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/15818/18525a42-c53f-d934-e966-d72440d53441.png">

ちなみにsecure: alwaysを指定するとhttpsのみになるのでオススメです。

```yaml:app.yaml
handlers:
- url: /.*
  script: _go_app
  secure: always
```

# まとめ

とりあえず、すぐに使いたいって人用の手順です。
自動化したいのでなんとかしようと思います。
理想はGoogleに対応してもらってカスタムドメイン追加した時にLet's Encryptを使うかどうか聞いてくれて　チェック入れたら勝ってに設定してくれるのが最高ですね。

というわけでPaaSサービスにも設定することはできました。
Let's Encryptは自動更新が前提なので有効期間も短いので本当に早めに自動更新をなんとかしたいです。