Бесплатные сертификаты SSL от Let's Encrypt и их автоматическое развёртывание в Amazon S3 (CloudFront)

Подключил к блогу бесплатный SSL от Let's Encrypt, попутно настроив CloudFront (это такой CDN от Amazon) для S3, рецепт ниже.

1) В Amazon IAM создаём нового пользователя.

Добавляем полиси, где прописываем используемый бакет.

Или можно просто разрешить запись/чтение бакета + IAMFullAccess и CloudFrontFullAccess.

2) Устанавливаем aws клиент для OS X.

brew install awscli

Создаём конфигурацию с ключами созданного пользователя в амазон:

aws configure

Зависимость нужна для того, чтобы Boto 3, используемый в плагине letsencrypt-s3front (о нём ниже), подтягивал ключи из конфига, а не переменных, есть такая у них фича:

The mechanism in which boto3 looks for credentials is to search through a list of possible locations and stop as soon as it finds credentials. The order in which Boto3 searches for credentials is:
1. Passing credentials as parameters in the boto.client() method
2. Passing credentials as parameters when creating a Session object
3. Environment variables
4. Shared credential file (~/.aws/credentials)
5. AWS config file (~/.aws/config)
6. Assume Role provider
7. Boto2 config file (/etc/boto.cfg and ~/.boto)
8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured.
Each of those locations is discussed in more detail below.

3) Устанавливаем клиент для letsencrypt.

pip install letsencrypt  

Так как сертификат выдаётся всего на три месяца, заниматься ручным2 обновлением нет никакого желания. Поэтому устанавливаем:

pip install letsencrypt-s3front

Который будет заниматься обновлением ключей в letsencrypt и их установкой в CloudFront.

4) Создаём CloudFront запись в AWS.

Alternate Domain Names (CNAMEs): fluder.co Default Root Object: index.html

Из общего списка копируем ID, пример: E31RB28LMK1L41

5) Получаем сертификаты и загружаем в CloudFront по полученному выше ID.

letsencrypt --agree-tos -a letsencrypt-s3front:auth --letsencrypt-s3front:auth-s3-bucket fluder.co --letsencrypt-s3front:auth-s3-region eu-central-1 -i letsencrypt-s3front:installer --letsencrypt-s3front:installer-cf-distribution-id E31RB28LMK1L41 -d fluder.co

6) Возвращаемся в CloudFront и выбираем загруженный сертификат.

Custom SSL Certificate: le-fluder.co Custom SSL Client Support: Only Clients that Support Server Name Indication (SNI)

7) Автообновление в крон (1 раз в месяц):

crontab -e

# fluder.co letsencrypt SSL

0 0 1 * * /usr/local/bin/letsencrypt --agree-tos -a letsencrypt-s3front:auth --letsencrypt-s3front:auth-s3-bucket fluder.co --letsencrypt-s3front:auth-s3-region eu-central-1 -i letsencrypt-s3front:installer --letsencrypt-s3front:installer-cf-distribution-id E31RB28LMK1L41 -d fluder.co --renew-by-default --text

8) В Route53 к A записи fluder.co выбираем алиас CloudFront. Сразу он не доступен, нужно подождать пока CDN развернётся полностью.

9) Для блога, Default Root Object: index.html будет работать только в корне, субдиректории выше будут игнорироваться1, это может сломать ссылки без index.html в конце URL.

Исправляется в CloudFront -> Origins -> Origin Domain Name

Не правильно — fluder.co.s3.amazonaws.com
Не правильно — fluder.co.s3.eu-central-1.amazonaws.com
Правильно — fluder.co.s3-website.eu-central-1.amazonaws.com


  1. Рецепт взял у kf 👍 

  2. В ручном режиме нужно проходить верификацию от letsencrypt, но если у вас свои сертифкаты, то проще сделать как рекомендует wallin. 


comments powered by Disqus