Let's Encryptの証明書で、Amazon API Gatewayのカスタムドメイン名を作成する

# 用意するもの

1. 証明書生成用Webサーバ
ポート80,443でステータス200が返せるWebサーバ(一時的でも可)

2. Certbot クライアント
Let's Encryptを証明書生成用Webサーバにインストールする（コマンドが叩ける状態）

## 流れ

1. 証明書生成用Webサーバを使って、証明書を生成する
2. Amazon API Gatewayのカスタムドメイン名（＊１）を作成する

(＊１) 例）カスタムドメイン名は、「api.mydomain.net」とする。

## 事前準備

### 1.カスタムドメイン名でアクセス可能なホストを用意

今回は、ApacheのVirtualHostを用意する
--
```ssl-api.conf
<VirtualHost *:80 *:443>
ServerName api.mydomain.net

# とりあえず、レスポンスが正常に返れば良いので、デフォルトのドキュメントルートの設定
DocumentRoot "/var/www/html"
</VirtualHost>
```

DNS(＊2)で、「api.mydomain.net」のAレコードに、WebサーバへアクセスできるグローバルIPを設定しておく
--
(＊2) 今回は、Route53でドメインを管理しているので、Route53を使いました。

### 2.Let's Encryptのインストール

[Certbot クライアントの準備](https://letsencrypt.jp/usage/#Install)
を見てインストールする

### 3.いざ証明書を生成

証明書生成用Webサーバで以下のコマンドを実行
--
①Apacheを停止させる
`/etc/init.d/httpd stop`

②証明書を生成
`/usr/local/certbot/certbot-auto certonly -a standalone -d api.mydomain.net`

生成に成功するとLet's Encryptのサイトにもある様に
[SSL/TLS サーバ証明書の取得完了](https://letsencrypt.jp/usage/#SaveCertificate)
/etc/letsencrypt/live/api.mydomain.netに、各種ファイルが生成されます。

複数回実行した場合、
/etc/letsencrypt/live/api.mydomain.net
/etc/letsencrypt/live/api.mydomain.net-001
の様に連番が付きます。

>取得した証明書等の 実体 は、下記の場所に保存されます。
サーバ証明書（公開鍵）
/etc/letsencrypt/archive/ドメイン名/certN.pem
※このファイルは SSL/TLS サーバ証明書（公開鍵を含む）です。中間証明書や秘密鍵は含まれていません。
※このファイルは Apache 2.4.8 未満 において、SSLCertificateFile ディレクティブで指定します。
※Apache 2.4.8 以降 や nginx では、このファイルは使用しません。

>中間証明書
/etc/letsencrypt/archive/ドメイン名/chainN.pem
※このファイルは、Webサイトへのアクセス時にブラウザに提供する中間証明書です。
※このファイルは Apache 2.4.8 未満 において、SSLCertificateChainFile ディレクティブで指定します。
※Apache 2.4.8 以降 や nginx では、このファイルは使用しません。

>サーバ証明書と中間証明書が結合されたファイル
/etc/letsencrypt/archive/ドメイン名/fullchainN.pem
※このファイルは、certN.pem と chainN.pem の内容が結合されたファイルです。SSL/TLS サーバ証明書（公開鍵を含む）と中間証明書の両方が含まれています。
※このファイルは、Apache 2.4.8 以上では SSLCertificateFile ディレクティブ、nginx では ssl_certificate ディレクティブで指定します。
※Apache 2.4.8 未満 では、このファイルは使用しません。

>秘密鍵
/etc/letsencrypt/archive/ドメイン名/privkeyN.pem
※このファイルは Apache（全バージョン） の SSLCertificateKeyFile ディレクティブ、nginx の ssl_certificate_key ディレクティブで指定します。
※ファイル名の N には、取得した証明書等の番号（発行順で連番）が入ります。
※Let's Encrypt で当該ドメインの証明書を発行したのが1回目の場合には、ファイル名の N は 1 となります。
※既に証明書等が保存されている状態で再度証明書等を取得した場合には、ファイル名の N が 2 以上の新しい番号で証明書等が保存されます。古い証明書等が上書きされることはありません。

>また、上記の証明書等への シンボリックリンク が、下記の場所に作成されます。
サーバ証明書（公開鍵）
/etc/letsencrypt/live/ドメイン名/cert.pem
中間証明書
/etc/letsencrypt/live/ドメイン名/chain.pem
サーバ証明書と中間証明書が結合されたファイル
/etc/letsencrypt/live/ドメイン名/fullchain.pem
秘密鍵
/etc/letsencrypt/live/ドメイン名/privkey.pem
※既に証明書等が保存されている状態で新しい証明書等を取得した場合には、シンボリックリンクのリンク先のパスが新しい証明書等に変更されます。
※Apache や nginx などのWebサーバの設定で SSL/TLS の証明書等のファイルを指定する際に、シンボリックリンクで指定しておくと、証明書等の更新時にWebサーバの設定ファイルの書き換えが不要となります。

Amazon API Gatewayのカスタムドメイン名を作成する
--

cloudfrontにディストリビューションドメイン名「*************.cloudfront.net」が作成されるのに40分程掛かる

AWS CLIを利用する場合
--
`sudo aws apigateway create-domain-name --domain-name api.mydomain.net --certificate-name my-certificate-1 --certificate-body file:///etc/letsencrypt/live/api.mydomain.net/cert.pem --certificate-private-key file:///etc/letsencrypt/live/api.mydomain.net/privkey.pem --certificate-chain file:///etc/letsencrypt/live/api.mydomain.net/chain.pem
`

マネージメントコンソールを利用する場合
--
![スクリーンショット 2016-11-24 11.55.40.png](https://qiita-image-store.s3.amazonaws.com/0/44351/ddda27de-8f0e-6f94-312e-fa73b5ff43f2.png)

DNS プロバイダーによってエイリアスリソースレコードを作成し、カスタムドメイン名 を ディストリビューションドメイン名 にマッピングする
*************
--

エイリアスが使えなかったので、CNAMEで登録した。
>先に作っていた、Aレコードは削除する


# 参考

https://gist.github.com/rcknr/f7cb503f270e89c29dc70d1c8ef29461
http://dev.classmethod.jp/cloud/aws/api-gateway-with-custom-domain/