AWS ELBに証明書を登録しようとしたときにエラーになったので、その回避策をメモ。
AWS ELBではHTTPSで行われた通信をELBデコードして、バックエンドのサーバーとはHTTPで通信することができます。
こうしておくと証明書更新などで複数台のEC2を直接手を入れることなく、またウェブサーバー側のSSL通信に関わるオーバーヘッドも無くなるため、AWS内で構築する場合には採用することが多いかと思います。
この構成を取る場合、証明書、証明書の秘密鍵をELBにアップロードする必要があります。
エラーの内容
新規でELBを構築しようとした場合、管理コンソールには上のような設定画面があり、証明書・秘密鍵・中間証明書をそれぞれ入力して登録するのですが、何度正しい証明書を登録しようとしても「Server Certificate not found for the key」というエラーで弾かれてしまいました。
ちなみに、証明書自体が誤りの場合は「Unable to parse certificate. Please ensure the certificate is in PEM format.」というエラーが出ます。
解決策
何度やってもダメだったので、諦めてAWS CLIから証明書を登録するとうまくいきました。
|
1 2 3 4 5 |
$ aws iam upload-server-certificate \ --server-certificate-name [証明書の名前] --certificate-body file://[証明書へのパス] --private-key file://[秘密鍵へのパス] --certificate-chain file://[中間証明書へのパス] |
カレントディレクトリに3つのファイル example.com.crt, example.com.key, example.com.ca.crt を置いて実行します。拡張子も自由ですが、私はcrtは証明書、keyは秘密鍵として命名しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ aws iam upload-server-certificate \ --server-certificate-name example.com-160915 --certificate-body file://example.com.crt --private-key file://example.com.key --certificate-chain file://example.com.ca.crt { "ServerCertificateMetadata": { "Path": "/", "Arn": "arn:aws:iam::XXXXXXX:server-certificate/exmple.com-160915", "ServerCertificateId": "XXXXXXXXXX", "ServerCertificateName": "XXXXXXXXXXXXXXXX", "UploadDate": "2016-02-06T00:20:39.411Z" } } |
応答の形式はCLIの設定に依存しますが、正しくアップロードできれば上のように登録した証明書のメタデータが返ってきます。
このARNを使うことでそのままCLIからELBを設定することもできますし、管理コンソール上からも選択できるようになります。
AWS Certificate Manager のコト
余談になりますが、最近、AWS上で証明書を発行・管理できる、 AWS Certificate Manager(ACM)がリリースされました。
まだ東京リージョンでは利用できないのですが、早速使ってみたところ、ものの数分で有効な証明書が無料で使用できるようになりました。ドメインを入力すると、一般的な管理者アドレス(例えば admin@example.com など)に承認メールが届き、そのメールを介して所有権確認が行われ、即時発行される仕組みです。当然ですがAWSの他サービス(ELB、CloudFront等)との親和性が非常に高く、また証明書発行・維持は完全に無料です。
残念ながらACMで発行した証明書を別のリージョンで使うことはできなかったので、東京リージョンで使えるようになるのが待ち遠しいです。
所感
最近お仕事が本当に忙しくて、全然寝られない日々が続きました。体も壊したので、いくら引きこもったまま働けるIT系でも体が一番の資本だなあと再認識しました。エンジニアのみなさん、深夜に電話に起こされることがないようなシステム(プログラムも、運用体制も)を作っておくことをオススメします。。。





