cloudfront代替ドメインに独自SSL証明書設定(PKCS#12利用)

![Storage-Content-Delivery_AmazonCloudFront.png](https://qiita-image-store.s3.amazonaws.com/0/50310/5aa71c9d-c859-17cc-2200-fe4f84e4a195.png)

# 01.はじめに
**cloudfrontに設定した代替ドメインに独自SSL証明書を設定する方法を記載します**
(今更な内容ですが、私の備忘録として記載しております)

## 01-1.　cloudfrontのSSL証明書
・cloudfrontのDistributionにはデフォルトで共用のワイルドカードSSL証明書(*.cloudfront.net)が設定されています。ディストリビューション名でアクセスする場合、下記のようにこちらを利用することが出来ます。
例) https://1234567890abc.cloudfront.net 
→ 上記のような、Distributionに割り当てられたDomain名にてHTTPS通信が出来ます。

## 01-2. 前提
・cloudfrontのDistributionの設定が出来ている
・cloudfrontに独自ドメインを設定している (例: example.com)
・DNS(Route53など)に、そのドメインが登録されている 
`<独自ドメイン> IN CNAME <DistributionのDomain Name>`

・AWS　CLIを利用出来る環境がある
・証明書設定権限が付与されたIAMアカウントがある(AWS CLI実行時に必要)


## 01-3. 参考ドキュメント
**HTTPS 接続を使用したオブジェクトへのアクセス** (AWS Documentより)
http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#CNAMEsAndHTTPS

# 02. 証明書一式の用意
## 02-1.独自証明書
・通常のSSL証明書取得と同様になります。
認証機関より発行された証明書を用意ください。

## 02-2. PKCS# 12を利用する場合
・拡張子名がp12もしくはpfxとなっている秘密鍵、SSL証明書が組み込まれたコチラのファイルを利用する場合、cloudfrontへの設定にあたってELB同様ファイルを別ける必要があります。

■手順
・opensslコマンドで下記のように取り出していきます。
その際、こちらもELB設定時同様、秘密鍵のパスフレーズを抜いています。

```bash
$ openssl pkcs12 -in example.p12 -nocerts -nodes -out example.key
$ openssl pkcs12 -in example.p12 -clcerts -nokeys -out example.crt
$ openssl pkcs12 -in example.p12 -cacerts -nokeys -out example.ca-bundle
```

・メモ
抽出した秘密鍵、証明書の先頭部に下記のような情報が含まれていましたが、
正常に登録できることを確認しております。

```text
Bag Attributes
    localKeyID: 07 06 56 ** 2E ** 3C 91 9C A7 B8 26 FF 8F 58 65 4E ** ** **
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
```

■中間証明書が空だった場合
・証明書の種類を確認し、公式サイトより中間証明書をDLします。
→　example.ca-bundle に貼り付けました。

・例: Cybertrust Japan Public CA G3　の 場合
https://www.cybertrust.ne.jp/sureserver/support/download_ca.html


#03. 証明書一式のアップロード
## 03-1. 参考ドキュメント
**What is AWS Certificate Manager?**　(AWS Documentより)
http://docs.aws.amazon.com/ja_jp/acm/latest/userguide/acm-overview.html

## 03-2. IAM 証明書ストアにアップロード
・用意したSSL証明書をIAM 証明書ストアにアップロードします。
今回はAWS CLIを利用します。

・実行例:

```bash
$ aws iam upload-server-certificate --server-certificate-name mitzi-test --path /cloudfront/ --private-key file://example.key --certificate-body file://example.crt --certificate-chain file://example.ca-bundle
```

・実行結果

```
{
    "ServerCertificateMetadata": {
        "ServerCertificateId": "*****************",
        "ServerCertificateName": "mitzi-test",
        "Expiration": "2017-12-15T14:59:00Z",
        "Path": "/cloudfront/",
        "Arn": "arn:aws:iam::**********:server-certificate/cloudfront/mitzi-test",
        "UploadDate": "2016-06-18T23:30:17.398Z"
    }
}
```

▽補足
・証明書の登録名称(任意): mitzi-test
・カレントディレクトリ配下に「秘密鍵、SSL証明書、中間証明書」がある状態で実行しています。
・中間証明書は設定する必要があるようです。(中身が空でアップロードしたところエラーとなりました)
・--path パラメータ。 証明書を IAM にアップロードする場合、-path パラメータ（証明書のパス）の値が /cloudfront/ で始まる必要があるとのことです。

#04. 証明書の登録
・下記図のようにAWSコンソールより、アップロードした証明書を選択する
![AWS_CloudFront_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/50310/d349c011-2e3b-559a-f894-1dacf539389b.png)


#05. 確認
・cloudfrontに設定した独自ドメインでHTTPS通信が出来ることを確認

https://example.com/1234.png
→ 「1234.png」は、origin(S3など)に格納されているファイル名を指定しています。

※補足
・公式ドキュメントより
「証明書をディストリビューションに追加すると、CloudFront はそのすべてのエッジロケーションに証明書を直ちに伝達します。」
とのことです。

# 06.おまけ
# 06-1 証明書の削除
・アップロードしたSSL証明書を削除する場合、下記コマンドを実行します

```bash
$ aws iam delete-server-certificate --server-certificate-name mitzi-test
```

# 07.おわり

以上でcloudfrontに独自SSL証明書を設定することが出来ました。