Google AppEngine - Custom Domain + SSLが簡単になった

Google AppEngine で独自ドメイン + SSL を使うとき、以前だったら Google Apps を経由しないといけなかったのですが、本日 Apps なしで Google Developers Console から直接設定する機能がリリースされました。
[Announcing SSL for GAE Custom Domains in the Developers Console](https://groups.google.com/d/msg/google-appengine/ge-qFsFgtHM/EVEIJD0vBAAJ)

さっそく試してみました。

## まずは Custom Domain を登録する

[Adding a custom domain for your application](https://cloud.google.com/appengine/docs/using-custom-domains-and-ssl#adding_a_custom_domain_for_your_application)

Developers Console の Compute > AppEngine > Settings で Custom Domains タブをクリックして "Add a custom domain" ボタンをクリック。

1. 未登録のドメインであれば、 "1. If you haven't already, verify that you own the domain." でドメイン名を入力して Verify をクリックする。 (Name.com などの有名レジストラであれば一瞬で完了、それ以外はTXTレコードなどを追加して認証)
  * サブドメイン( www.example.com など)を使うときも、認証は Naked なドメインでやったほうが良さそう。 AppEngine App で使うサブドメインは後で指定できる。
2. ドメインを認証したら、 "2. Select the domain you want to point to..." でAppEngine Appで使うドメインを選ぶ。
3. DNS に設定するレコードが表示されるので、 DNS にレコードを追加する。
  * 1 でサブドメインとしてドメイン認証して、 2 でサブドメインを指定してないと A レコードと AAAA レコードをいっぱい設定するはめになってちょっと面倒。

![Add_Domain.png](https://qiita-image-store.s3.amazonaws.com/0/50490/648f6a99-bc5d-1531-2390-a5964ddaee20.png)


## SSL 証明書を取得する

AppEngine が受け付けるのは下記のタイプの証明書。 [More about App Engine support for SSL certificates](https://cloud.google.com/appengine/docs/using-custom-domains-and-ssl#more_about_app_engine_support_for_ssl_certificates)

* Single Domain/Hostname
* Self-signed
* Wildcard
* Subject Alternative Name (SAN) / Multi Domain

今回は Rapid SSL で試しにとってみました。やり方忘れがちなのでメモです。

1. Private Keyを作る `# openssl genrsa -des3 -out appengine.key 2048`
2. CSRを作る `# openssl req -new -key appengine.key -out appengine.csr`
  * Common Name は AppEngine App で使うドメインを正しく入力。(今回なら app.testdomain-00.com )
3. Rapid SSL の Portal に CSR を貼り付けて証明書を取る
  * `-----BEGIN CERTIFICATE-----` から始まるやつが出てくるので、 `appengine.crt` とかの名前で保存する。
4. Private Key ファイルの Pass Phrase を消す `openssl rsa -in appengine.key -out appengine-nopass.key`
  * これやってなくてハマった。(Developers Consoleから登録するときにエラーになる: "The SSL certificate provided could not be inserted.")


## Developers Console に証明書を登録する

Developers Console の Compute > AppEngine > Settings で SSL Certificates タブをクリックして "Upload a new certificate" ボタンをクリック。

1. "PEM encoded X.509 public key certificate" には、証明書ファイル(上記の `appengine.crt` )をアップロード
2. "Unencrypted PEM encoded RSA private key" には、 **Pass Phraseなしの** 秘密鍵ファイル(上記の `appengine-nopass.key` )をアップロード
  ![AddSSLCert.png](https://qiita-image-store.s3.amazonaws.com/0/50490/ee4b09ff-71e5-dfa8-34f0-c2796385c33b.png)

3. "Upload" ボタンをクリックする
4. 最後に "Enable SSL for the following custom domains" で AppEngine App に使うドメインにチェックを入れて "Save" ボタンをクリックする。
  ![App_EngineSSLDomain.png](https://qiita-image-store.s3.amazonaws.com/0/50490/a244b150-4467-1fdc-446a-e092ed5bda65.png)


## 試してみる

以上でカスタムドメインでも HTTPS でアクセスできるはずです。
![SSL Enabled.png](https://qiita-image-store.s3.amazonaws.com/0/50490/13fce872-dc44-d1ab-8b5d-673179d2af91.png)


## いまのところできなさそうなこと

* Developers Console から登録する証明書は、 SNI でのみ使用可能。Virtual IP は相変わらず Google Apps 経由でしか使えない模様。 [Purchasing a virtual IP (VIP)](https://cloud.google.com/appengine/docs/using-custom-domains-and-ssl#purchase_a_vip)
* Naked ドメインでも SSL を使えるようになったのかはまだ試してません。
  * [Adding a custom domain for your application](https://cloud.google.com/appengine/docs/using-custom-domains-and-ssl#adding_a_custom_domain_for_your_application) には " **If you are not using SSL**, and want to use a naked domain, use the first option to specify a naked domain (such as http://example.com)." って書いてある…。



Google Apps の¥500/月の経費申請書出すのがめんどくさすぎて SSL / Custom Domain を諦めていた自分には、お手軽になって朗報でした。