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.
Далее мы выполним:
- создадим S3 корзину azinchenko.com для сайта с индексной страницей
- создадим CloudFront distribution, подключенный к этой корзине
- получим новый сертификат в ACM для azinchenko.com, подключим его к CloudFront-azinchenko.com
- добавим CloudFront distribution для azinchenko.top с origin в виде корзины azinchenko.com
- получим новый сертификат в ACM для azinchenko.top, подключим его к CloudFront-azinchenko.top
Содержание
Создание S3 для основного сайта
Детальнее – в посте AWS: S3 – хостинг статического сайта.
Создаём корзину:
[simterm]
$ aws s3 mb s3://azinchenko.com
make_bucket: azinchenko.com
[/simterm]
Включаем хостинг:
[simterm]
$ aws s3 website s3://azinchenko.com --index-document index.htm --error-document 4xx.htm
[/simterm]
Создаём azinchenko.com.policy.json
с описанием политики доступа:
{ "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadForGetBucketObjects", "Effect":"Allow", "Principal": "*", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::static-site-example/*" ] } ] }
Подключаем его к корзине:
[simterm]
$ aws s3api put-bucket-policy --bucket azinchenko.com --policy file://azinchenko.com.policy.json
[/simterm]
Создаём индексную страницу:
[simterm]
$ echo "Test Site index page" > index.htm
[/simterm]
И страницу ошибок:
[simterm]
$ echo "Error page" > 4xx.htm
[/simterm]
Загружаем их:
[simterm]
$ 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
[/simterm]
Проверяем сайт:
[simterm]
$ curl azinchenko.com.s3-website-eu-west-1.amazonaws.com Test Site index page
[/simterm]
CloudFront для azinchenko.com
Детальнее – в посте AWS: CloudFront – описание, примеры.
Создаём CloudFront distribution, в качестве origin указываем Endpoint из Properties созданной выше корзины, в данном случае это будет azinchenko.com.s3-website-eu-west-1.amazonaws.com:
Указываем Redirect HTTP to HTTPS и
Ждём статус Deployed и проверяем:
[simterm]
$ curl -L d9seev6unhze3.cloudfront.net Test Site index page
[/simterm]
Подключение домена azinchenko.com
Обновляем CloudFront distibution, добавляем Alternate Domain Names (CNAMEs) в виде azinchenko.com и www.azinchenko.com (вообще-то надо было сделать сразу, при создании дистрибьюции):
Обновляем запись для домена – указываем ALIAS в виде URL CloudFront distibution.
azinchenko.com обслуживается DNS Amazon-а, обновляем запись в Route53:
Проверяем:
[simterm]
$ curl -kL azinchenko.com Test Site index page
[/simterm]
Используем опцию -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, добавляем сертификат, выбираем
Проверяем:
[simterm]
$ curl -L azinchenko.com
Test Site index page
[/simterm]
Уже без -k
, т.к. имеется сертификат с именем azinchenko.com:
[simterm]
$ openssl s_client -showcerts -connect azinchenko.com:443 CONNECTED(00000003) ... Verify return code: 0 (ok) ...
[/simterm]
Либо с помощью nmap
:
[simterm]
$ 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: ...
[/simterm]
И www:
[simterm]
$ curl -L www.azinchenko.com
Test Site index page
[/simterm]
С этим закончили.
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 дистрибьюции:
[simterm]
$ curl d25wa18u0lal86.cloudfront.net Test Site index page
[/simterm]
Всё гуд – отдаёт содержимое основного сайта.
ACM для azinchenko.top
Аналогично предыдущему примеру – получаем сертификат для azinchenko.top:
Выполняем верификацию через DNS:
Обвновляем CloudFront – меняем SSL:
Обновляем запись для домена – указываем ALIAS в виде URL CloudFront distribution:
Ждём обновления DNS и CloudFront, проверяем:
[simterm]
$ curl https://azinchenko.top Test Site index page
[/simterm]
И www:
[simterm]
$ curl https://www.azinchenko.top Test Site index page
[/simterm]
Готово.