ACMでSSL証明書0円運用ができなかったはなし


まえがき

(2016/02/02 22:50 追記)
この記事でとりあげるのは一般的なウェブシステム(LAMP)です。
後述しますが全てのケースにおいてSSL証明書0円ができないわけではありません。


はじめに

1/22にAWSに新機能「AWS Certificate Manager」(ACM)が追加されました。
ELBとCloudFront限定ですが無料でSSL証明書を発行できて,しかもワイルドカードにも対応しているイケてるサービスです。

残念ながら2/2現在,米国東部 (バージニア北部)でしか使えないので東京にあるELBでは使用できません。
CloudFrontはリージョン関係ないので今日から恩恵にあずかれる・・・・はずでした。

何が起こったか

ある日を境にhttps接続で502が返ってくるようになりましたorz

事の始まりは

とあるサービスのSSL証明書が有効期限をまもなく迎えようとしているとある日,ACMなるサービスが発表されました。
ちょうどいい機会だったので今まで使用していたSSL証明書は廃止してACMに全面移行しようと考えました。

その時の構成は東京リージョン内で ELB + EC2 という構成を取っていました。
残念ながらACMは未だ東京では使用できないため必然的にCFを使うことになります。

CFとACMの設定については割愛しますが,問題なく稼働していることが確認できたのでこのままSSL証明書0円運用を始めました。

そして事件が起こる

ACMによるSSL証明書0円運用を始めて1週間ほど経った日,既存のSSL証明書の有効期限を迎えました。

CFはELBと違いオリジンの証明書の正当性を要求するため,有効期限切れのSSL証明書を使っている限りCFはオリジンと通信ができません。
そのためCFは502を返していたのです。

ドキュメントに以下のように書いてあります。

ステップ 3 でオリジンと通信するときに HTTPS を使用するように CloudFront を構成した場合、CloudFront は確立されたサードパーティ認証局によって証明書が発行されたことを確認します。CloudFront は Mozilla と同じ認証局をサポートします。現在のリストについては、「Mozilla に付属する CA 証明書一覧」を参照してください。自己署名証明書を使用することはできません。

どう対応したか?

今回は障害を解消するスピードを優先するためにSSL証明書を買いました。

SSL証明書0円運用はできないのか?

結論から言うと限られた条件を満たした場合にとSSL証明書0円運用は可能です。
CFはオリジンのSSL証明書の正当性を要求するためオリジンに有効なSSL証明書がインストールされていれば良いのです。

  1. オリジンとしてS3を使用する
  2. オリジンへのアクセスは全てhttpとする
  3. 米国東部(バージニア北部)を使用する
  4. StartSSLなどで無料のSSL証明書を取得する

1.のパターンは言わずもがなですね。
問題として静的なものしか配信できないです。
2.のパターンは最大の問題としてオリジンとの通信が暗号化されないです。
AWS内の通信になるはずなので盗聴は現実的でないかもしれませんが,暗号化すべきデータが暗号化されていない状態になるのは避けたいところです。
3.のパターンはELBはバックエンドのSSL証明書エラーを無視できることを利用します。
ELBでACMを使用するために米国東部 (バージニア北部)を使用する必要があります。(2/2現在)
4.のパターンは無料のSSL証明書を使用していることをエンドユーザからは隠せることがメリットですかね。
ACMも無料じゃんと突っ込まれそうですがAWSが証明してくれている安心感?があると思います。

まとめ

ACMでSSL証明書0円運用を試みて見事に失敗しました。
実は障害を起こしたのは本番運用しているサービスでした。
CFはバックエンドのSSL証明書をチェックしないと思い込んでいたためのミスです。
これを公開することで同じ失敗が繰り返されないことを願っています。