AWS: SSL Certificate Manager, CloudFront, S3 static website хостинг и несколько доменов

Автор: | 12/14/2017
 

AWS Certificate Manager (ACM) позволяет создавать и управлять SSL сертификатами для сайтов и приложений в AWS.

С его помощью можно получить новый сертификат — или загрузить и использовать свой.

Документация по ACM — тут>>>.

Задача: создать хостинг статического сайта в AWS S3, отдавать контент через CDN CloudFront, получить SSL в AWS ACM для двух имён и подключить их к этому сайту.

Идея такова:

  • один основной домен, azinchenko.com, будет привязан к CloudFront distribution с ACM сертификатом azinchenko.com, у которой в роли origin будет указана S3 корзина azinchenko.com
  • дополнительный домен, azinchenko.top, будет подключен к отдельной CloudFront distribution с ACM сертификатом ACM azinchenko.top, у которой в роли origin будет указана та же корзина azinchenko.com

Таким образом — у нас будет пара доменных имён, привязанных к одной корзине-сайту через две разные дистрибьюции CloudFront-а и оба домена будут использовать собственный SSL.

Далее мы выполним:

  1. создадим S3 корзину azinchenko.com для сайта с индексной страницей
  2. создадим CloudFront distribution, подключенный к этой корзине
  3. получим новый сертификат в ACM для azinchenko.com, подключим его к CloudFront-azinchenko.com
  4. добавим CloudFront distribution для azinchenko.top с origin в виде корзины azinchenko.com
  5. получим новый сертификат в ACM для azinchenko.top, подключим его к CloudFront-azinchenko.top

Создание S3 для основного сайта

Детальнее — в посте AWS: S3 – хостинг статического сайта.

Создаём корзину:

aws s3 mb s3://azinchenko.com
make_bucket: azinchenko.com

Включаем хостинг:

aws s3 website s3://azinchenko.com --index-document index.htm --error-document 4xx.htm

Создаём azinchenko.com.policy.json с описанием политики доступа:

{
  "Version":"2012-10-17",
  "Statement":[{
    "Sid":"PublicReadForGetBucketObjects",
        "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::static-site-example/*"
      ]
    }
  ]
}

Подключаем его к корзине:

aws s3api put-bucket-policy --bucket azinchenko.com --policy file://azinchenko.com.policy.json

Создаём индексную страницу:

echo "Test Site index page" > index.htm

И страницу ошибок:

echo "Error page" > 4xx.htm

Загружаем их:

aws s3 cp index.htm s3://azinchenko.com
upload: ./index.htm to s3://azinchenko.com/index.htm
aws s3 cp 4xx.htm s3://azinchenko.com
upload: ./4xx.htm to s3://azinchenko.com/4xx.htm

Проверяем сайт:

curl azinchenko.com.s3-website-eu-west-1.amazonaws.com
Test Site index page

CloudFront для azinchenko.com

Детальнее — в посте AWS: CloudFront – описание, примеры.

Создаём CloudFront distribution, в качестве origin указываем Endpoint из Properties созданной выше корзины, в данном случае это будет azinchenko.com.s3-website-eu-west-1.amazonaws.com:

 

Указываем Redirect HTTP to HTTPS и 

Ждём статус Deployed и проверяем:

curl -L d9seev6unhze3.cloudfront.net
Test Site index page

Подключение домена azinchenko.com

Обновляем CloudFront distibution, добавляем Alternate Domain Names (CNAMEs) в виде azinchenko.com и www.azinchenko.com (вообще-то надо было сделать сразу, при создании дистрибьюции):

Обновляем запись для домена — указываем ALIAS в виде URL CloudFront distibution.

azinchenko.com обслуживается DNS Amazon-а, обновляем запись в Route53:

Проверяем:

curl -kL azinchenko.com
Test Site index page

Используем опцию -k, т.к. сертификат пока от CloudFront, и CommonName не совпадает.

AWS Certificate Manager

Следующим шагом — получаем сертификат для azinchenko.com.

Документация — тут>>>.

Переходим на страницу ACM в AWS Console, запрашиваем сертификат:

Для верификации домена — используем DNS:

На следующей странице будут указаны записи, которые необходимо добавить для проверки владельца:

Добавляем запись (на скриншоте ниже — вручную, но можно тыцнуть Create record in Route53, если домен на DNS Amazon):

Повторяем для www.azinchenko.com, ждём несколько минут, проверяем статус:

Ждём, пока AWS выдаст сертификат.

Добавление ACM SSL в CloudFront

Теперь можно обновить CloudFront и добавить новый сертификат.

Возвращаемся к дистрибьюции CloudFront, добавляем сертификат, выбираем 

Проверяем:

curl -L azinchenko.com
Test Site index page

Уже без -k, т.к. имеется сертификат с именем azinchenko.com:

openssl s_client -showcerts -connect azinchenko.com:443
CONNECTED(00000003)
...
Verify return code: 0 (ok)
...

Либо с помощью nmap:

nmap --script ssl-enum-ciphers azinchenko.com
Starting Nmap 7.60 ( https://nmap.org ) at 2017-12-14 14:45 EET
Nmap scan report for azinchenko.com (52.222.233.241)
Host is up (0.0095s latency).
Other addresses for azinchenko.com (not scanned): 52.222.233.166 52.222.233.110 52.222.233.75 52.222.233.29 52.222.233.186 52.222.233.13 52.222.233.220
rDNS record for 52.222.233.241: server-52-222-233-241.lhr52.r.cloudfront.net
Not shown: 984 closed ports
PORT     STATE    SERVICE
20/tcp   filtered ftp-data
...
80/tcp   open     http
443/tcp  open     https
| ssl-enum-ciphers:
|   TLSv1.0:
...

И www:

curl -L www.azinchenko.com
Test Site index page

С этим закончили.

CloudFront для azinchenko.top

Добавляем ещё один CloudFront distribution, в Origin Domain Name указываем URL той же корзины — azinchenko.com.s3-website-eu-west-1.amazonaws.com, в Alternate Domain Names (CNAMEs) указываем azinchenko.top, SSL пока от CloudFront:

Создаём, ждём статус Deployed, проверяем по URL дистрибьюции:

curl d25wa18u0lal86.cloudfront.net
Test Site index page

Всё гуд — отдаёт содержимое основного сайта.

ACM для azinchenko.top

Аналогично предыдущему примеру — получаем сертификат для azinchenko.top:

Выполняем верификацию через DNS:

Обвновляем CloudFront — меняем SSL:

Обновляем запись для домена — указываем ALIAS в виде URL CloudFront distribution:

Ждём обновления DNS и CloudFront, проверяем:

curl https://azinchenko.top
Test Site index page

И www:

curl https://www.azinchenko.top
Test Site index page

Готово.