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

Автор: | 14/12/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 – хостинг статического сайта.

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

[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]

Готово.