CloudFront経由で独自SSLでS3にアクセスする


Amazon S3はとても便利なクラウドストレージですが、残念ながらS3は独自SSLに対応していません。
そこで今回はS3のバケットにCloudFront経由で独自SSLを設定する方法をご紹介します。

AWS CLIのインストール

まずはAWSにSSLをインストールするため、AWS CLIをターミナルを使ってインストールします。

pip を使用してAWS CLIをインストールしていきます。

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install awscli

IAMユーザの作成と設定

AWSの管理画面からIAMでユーザの作成します。
既存のIAMユーザを使用する場合は作成の必要はありません。
IAMでユーザーの作成

IAMの認証情報もダウンロードしておきます。

IAMのポリシーを変更しAWSでSSLの設定が行えるように設定

AWSにSSLを設定できる権限を先ほど作成したIAMユーザに設定します。

IAMのインラインポリシーのカスタムポリシーで以下を入力して設定します。

AWS IAMポリシー

{
    "Statement": [
        {
            "Action": [
                "iam:DeleteServerCertificate",
                "iam:GetServerCertificate",
                "iam:ListServerCertificates",
                "iam:UpdateServerCertificate",
                "iam:UploadServerCertificate"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

AWS CLIの設定

IAMからAWS TOOLにアクセスできるように先ほど作成したIAMユーザの情報を設定していきます。
ダウンロードした認証情報を基にIAMユーザのアクセスキー IDとシークレットキーを設定します。

aws configure
AWS Access Key ID [None]:アクセスキーIDを入力
AWS Secret Access Key [None]:シークレットキーを入力
Default region name [None]:ap-northeast-1
Default output format [None]:

SSLの準備

今回はGOGET SSLで取得したSSL証明書を利用します。

GOGET SSLでSSLを取得すると、以下のようなファイル名で証明書に関するファイルが取得できます。

証明書のプロパティを確認できるよう、中間証明書のデータは以下のように拡張子を変更しておきます

sample-com-ca.crt

生成した秘密鍵や取得した証明書をOPEN SSLでチェック

AWSにアップロードする前にローカルでopensslコマンドを使って、チェックします。

以下のコマンドで秘密鍵をOpenSSLでチェックできます。

openssl rsa -in sample-com-private.key -check -noout

以下のように結果が出れば秘密鍵は問題ありません。

RSA key ok

証明書が正常に動作するかをOpenSSLでシミュレートします。各パラメータ次の様に指定します。

openssl s_server -accept 10443 -cert sample-com.crt -key sample-com-private.key -CAfile sample-com-ca.crt -WWW

以下のようにACCEPTとでればOKです。

ACCEPT

SSL証明書をAWSにアップロード

証明書のアップロード

取得した証明書関連のファイルをアップロードしていきます。

各項目以下のように指定しましょう。
アップロードするファイルにはファイル名の前にファイルのパスが必要になります。
file://の後にファイルのパスを指定しましょう。

上記を踏まえ以下のようにコマンドを実行して、証明書をアップロードします。

aws iam upload-server-certificate --server-certificate-name sample.com --certificate-body file://sample-com.crt --private-key file://sample-com-private.key --certificate-chain file://sample-com-ca.crt --path /cloudfront/sample.com/

成功すると以下の様なレスポンスが得られます。

{
    "ServerCertificateMetadata": {
        "ServerCertificateId": "xxxxxxxxxxxxxxxxxx",
        "ServerCertificateName": "sample.com",
        "Expiration": "2015-10-10T10:10:26Z",
        "Path": "/cloudfront/sample.com/",
        "Arn": "arn:aws:iam::000000000000:server-certificate/cloudfront/sample.com/sample.com",
        "UploadDate": "2015-10-10T10:10:10.637Z"
    }
}

SSLのアップロードができたら、CloudFrontの設定を行います。

CloudFrontの設定

ディストリビューションを作成します。

Cloud Frontディストリビューションの作成

CloudFrontの設定

ディストリビューションのセッティングをしていきます。

Origin Domain NameでS3のバケットのアドレスがサジェストされるので、該当のS3のバケットを指定します。

CloudFrontディストリビューションの設定

Custom SSLを選択すると先ほどアップロードした証明書がリストアップされるので該当のSSLを指定します。

Custom SSL Client SupportでSNIを指定します。

インストールされているSSLが表示されるので、選択します。

SNIを選択してOKします。

CloudFront SSLの設定

ディストリビューションを作成すると、CloudFrontのDeployが完了するまで30分ほど時間がかかります。Deployが完了すると以下のようにステータスが変わります。

CloudFrontデプロイ完了

デプロイ完了後、CloudFrontに割り当てられたアドレスにアクセスして確認するとS3のバケット内のファイルにアクセスすることができます。

CloudFront ドメインネーム

Route53でCloudFrontのディストリビューションを指定する。

CloudFrontの設定が完了したら、CloudFrontに対して、Route53で独自ドメインでアクセスできるように設定していきます。

DNS Managementから
Route53 startup
Create HostZoneを選択します。

Route53 CreateHostZone

SSLを設定するドメインを入力してCreateボタンをクリック
ドメインを入力してCreateボタンをクリック
Aレコードの設定でAliasをyesにしてAliasターゲットをデプロイしたCloudFrontのディストリビューションのアドレスを指定して保存

Route53の設定

生成されたすべてのNSレコードを該当のドメインのDNSレコードに加えます。

今回はお名前.comの「DNSレコード設定」で設定しました。
お名前.comへNSレコードを追加
以下のように設定したSSLのドメインでアクセスして表示されれば成功です。
https://設定したドメイン/s3のバケット以下のアドレス

AレコードじゃなくてCNAMEで設定したほうがいいのか?と思ってやり直そうと思いましたがAレコードのままでも良いみたいです。しかも課金されない点もいいですね。※たいした金額ではなさそうですが。
【AWS発表】 Amazon CloudFrontが独自SSL証明書とルートドメインホスティングをサポート

参考サイト
CloudFront Setup
CloudFrontの独自ドメインSSL証明書対応を試してみた
AWS CLI TOOLのインストール
devrel.jpをCloudFront NSIを使ってHTTPS化するまでの流れ

コメントを残す