待ちに待ったLet's Encryptの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のドキュメントを参考にしていただけると良いと思います。
HelloWorldをデプロイは済ませている前提です。
カスタムドメインをCloud DNSで管理
GCPではDNSサーバーを提供しています。
Cloud DNSを使うことでRESTやコマンドラインからDNSを操作できるので自動化もしやすいので僕はこれを使ってます。
これは無料ではないのですが放置してるだけなら月0.02ドルほどでした。
2円くらいです。
ネットワーキング -> Cloud DNSに行き
ゾーンの作成でわかりやすい名前とドメインを登録します。
僕はムームードメインでドメインを取得してそれのネームサーバをGoogleに向けています。
証明書取得のためGoogleComputeEngineのインスタンスを使う
ここからが肝になります。
どうしても外部からアクセスできるマシンが必要だったので同じGCPのサービスであるGoogleComputeEngineを利用します。
これはマシンを借りれるIaaSです
自分でOSを操作できるので自由度は高いですが個人用途を想定してVPSと比べると高くなってしまうので常用は避けてます。(大学生だしお金ない)
ですが出た当初よりも価格もだいぶ下がっているし 少しの時間の起動だけでいいならプリエンプティブという24時間以内のどこかで必ず停止するインスタンスがあり
それは通常の値段よりも大幅に安いので
今回の様なわずかな作業に最適なプランもあるので僕はGCPを利用しています。
あと立ち上がりも早いのでリクエストして30秒以内にはログインができるようになるのも魅力の一つですね。
メニューのCompute Engine -> VMインスタンスに行き
インスタンスを作成で作成します
名前はわかりやすいのにしておきましょう lets-encryptとかで
リージョンはus-centralのどれかで
マシンタイプはf1-microで大丈夫です。
OSはDebianでHTTP トラフィックを許可するにチェックを入れてください
それと可用性ポリシーでプリエンプティブをオンにしておきましょう。
課金は最低10分からで以降は1分単位で計算されます。
作成できたら外部IPをCloud DNSのAレコードに設定します。
そしてgcloudコマンドでsshログインします。
$ gcloud compute ssh $INSTANCE_NAME --zone $ZONE
INSTANCE_NAMEとZONEには作った名前とリージョンを入れてください。
ログインできたらgitを入れておきます。
$ sudo apt-get install -y git
クライアントをインストールします。
$ git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt
以下のコマンドでヘルプを表示しましょう。このコマンドを打つことで依存関係を解決するためパッケージのインストールが始まります。
$ sudo ./letsencrypt-auto --server \
https://acme-v01.api.letsencrypt.org/directory --help
次に証明書の作成コマンドです。
k2lab.netが証明書の欲しいドメインです。複数の場合は-dオプションを追加することで指定できます。
$ sudo ./letsencrypt-auto certonly -a standalone \
-d k2lab.net \
--server https://acme-v01.api.letsencrypt.org/directory
emailは復旧用などに使われるそうです。
利用規約に同意したらAgreeを押します。
作成に成功すると/etc/letsencrypt/live/k2lab.net/
に証明書や秘密鍵があります。
これはシンボリックリンクですがここを参照することで自動で更新されても再起動するだけで証明書が更新されるという想定です。
今回使うファイルはfullchain.pem
とprivate.pem
です。
作成できたらGAEの設定に行きカスタムドメインでドメインを指定して
AレコードやAAAAレコードの設定をしておきましょう
設定が終わったら同じ設定の中にSSL証明書を設定する場所があるので
そこで新しい証明書をアップロードで追加します。
PEM でエンコードされた X.509 公開鍵証明書はfullchain.pem
をコピペすれば大丈夫です。
復号化された PEM でエンコードされた RSA 秘密鍵は以下のコマンドで出力された物を貼り付けます。
$ sudo openssl rsa -inform pem -in privkey.pem -outform pem | less
これで https://k2lab.net にアクセスすればSSLが有効になってると思います!
しかもGoogleのサーバーだから当然HTTP2に対応してる!
ちなみにsecure: alwaysを指定するとhttpsのみになるのでオススメです。
handlers:
- url: /.*
script: _go_app
secure: always
まとめ
とりあえず、すぐに使いたいって人用の手順です。
自動化したいのでなんとかしようと思います。
理想はGoogleに対応してもらってカスタムドメイン追加した時にLet's Encryptを使うかどうか聞いてくれて チェック入れたら勝ってに設定してくれるのが最高ですね。
というわけでPaaSサービスにも設定することはできました。
Let's Encryptは自動更新が前提なので有効期間も短いので本当に早めに自動更新をなんとかしたいです。