AWS Cloud FrontでLet’s EncryptでSSL化

AWS Cloud FrontでLet’s Encryptの証明書を使いSSL化します。従量課金により破格で無料でSSL化のWebページの公開を始められます。Cloud Frontはアクセス数に応じて費用が発生し、SSL証明書を無料で手に入れることができれば、無料で始められます。爆速・安全なサイトをCloud Frontで提供する方法をご紹介します。

M1 MacでLet’s Encryptの証明書を取得

Let’s Encryptにて無料で証明書を取得しましょう。
M1 Mac環境での取得方法を紹介します。S3でウェブベージを公開できていることを前提とします。以下の記事でご紹介しています。

certbotをインストールします。

brew install certbot

インストール後は[/opt/homebrew/Cellar/certbot/2.1.0/bin/certbot]にインストールされています。
自身の環境ではbinにリンクが貼られませんでした。リンク貼らずにこのまま使ってみました。

/opt/homebrew/Cellar/certbot/2.1.0/bin/certbot --version
certbot 2.1.0

コマンドは使えるようです。シンボリックリンクを貼らずにこのまま証明書を作ってみます。
learning-english.algo-ai.workの証明書を発行する場合は以下のようなコマンドになります。

/opt/homebrew/Cellar/certbot/2.1.0/bin/certbot certonly --manual -d learning-english.algo-ai.work

打ってみると、「Create a file containing just this data」と表示されるので、認証のためにS3にファイル作って配置し認証します。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

And make it available on your web server at this URL:

http://learning-english.com/.well-known/acme-challenge/xxxxxxxxxxxxxxxxxxxxxxxxxxxx

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

ローカルで「.well-known/acme-challenge」のディレクトリを作り、ファイル内に「xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx」をコピーして貼り付けます。S3に.well-knownごとアップロードしてから[Enter]を押すと承認されて証明書が発行されます。

証明書一式は「/etc/letsencrypt/live/learning-english.algo-ai.work/」に配置されます。

証明書一式をCloud Frontに送付する

Cloud Frontに証明書一式をAWSコマンドで送付します。

IAMユーザを作成

まずはIAMユーザに権限を付与するためのポリシーを作成します。JSONタブで以下を作成し、ビジュアルエディタに戻って、次へ進み続けて「ポリシー作成」ボタンを押します。画面にボタンがない場合は、Web画面の文字を小さくしていくとボタンが見えてくると思います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:*ServerCertificate",
                "iam:*ServerCertificates"
            ],
            "Resource": "*"
        }
    ]
}

ポリシーを作成したらIAMを開きユーザを作成します。

ユーザを追加します。

作成したポリシーでcertificateの権限を与えユーザを作成します。

作成したユーザを選択して、認証情報タブを選択します。

その中で、アクセスキー欄がありますので、アクセスキーの作成をします。

アクセスキーとシークレットアクセスが取得できますので、控えておきましょう。aws consoleにて後ほど使います。

aws cliで証明書をCloud Frontに送付

awscliコマンドをm1 macにインストールします。

brew install awscli

aws configureと打つと、Access Key IDやSecret Access Keyを求められますので、先ほど控えていたキーを打ち設定完了です。

aws configure
AWS Access Key ID [****************]: 
AWS Secret Access Key [****************]: 
Default region name [ap-northeast-1]: 
Default output format [json]: 

awsコマンドでcertificateをアップロードします。ディレクトリ名は自身のドメイン名に変更して実行してください。

aws iam upload-server-certificate --server-certificate-name learning-english.algo-ai.work-ssl \
--certificate-body file:///etc/letsencrypt/live/test.algo-ai.work/cert.pem \
--private-key file:///etc/letsencrypt/live/test.algo-ai.work/privkey.pem \
--certificate-chain file:///etc/letsencrypt/live/test.algo-ai.work/chain.pem \
--path /cloudfront/

Cloud Frontで証明書を設定

作成した証明書をCloud Frontに設定します。
ディストリビューションを作成して、公開したWebサーバの情報があるオリジンドメインを選択します。

独自ドメインを使うため代替ドメイン名(CNAME)を設定します。

SSL証明書を選択します。先ほどアップロードした証明書があれば成功です。

Cloud Frontでウェブサーバを公開できているはずですので、数分待ってからディストリビューションドメイン名をコピーして、ブラウザの別タブのURLでアクセスできれば成功です。

お名前.comで独自ドメインをCloudFrontに紐づける

お名前.comでcnameを設定して、独自ドメインからS3のURLへアクセスできるようにします。

DNSでCNAMEの設定を行います。

CNAMEレコードとは、別名に正式名を紐づけることができる仕組みです。AWSにFQDNでアクセスできている状態ですので、正式名と紐づけて独自ドメインでアクセスできるようにします。

お名前.comにアクセスして、ドメインタブから「ドメインのDNS設定」をクリックします。

DNSレコード設定を利用するの「設定する」ボタンをクリックします。

レコードの追加をします。TYPEの「CNAME」を選択して、ホスト名はサブドメインの任意の名前、VALUEにはAWS CloudFrontのURLを記載します。追加ボタンをクリックして、確認して設定します。

終わりに

AWSのCloud FrontでLet’s Encryptの証明書を使いSSL化する方法を紹介しました。これでセキュリティも強化され、CDN環境を構築で、爆速なウェブサイトが作れますね。

よろしければTwitterフォローしてください。