Назад | Перейти на главную страницу

Pound + Letsencrypt для Play Framework и AWS CloudFront

Задний план

У меня есть старое веб-приложение Play Framework, которое обслуживает ресурсы из двух CDN (siteassets и courseassets), которые реализованы с помощью AWS CloudFront. Фунт работает на той же виртуальной машине, что и веб-приложение, и просто действует как конечная точка SSL, поскольку используемая старая версия Play Framework не поддерживает SSL. Pound привязывается к портам 80 и 443. Веб-приложение Play связывается с портом 9000.

Раньше я использовал подстановочный сертификат Symantec SSL для ресурсов CDN и веб-приложения. Теперь, когда у сертификатов Symantec SSL осталось всего несколько дней, прежде чем они станут недействительными, я решил использовать AWS Certificate Manager для предоставления однодоменных SSL-сертификатов для CDN и использовать Letsencrypt для предоставления однодоменного SSL-сертификата для webapp. Сертификаты Letsencrypt действуют всего 90 дней, поэтому их нужно обновлять автоматически.

Паунду нужны сертификаты SSL в формате PEM, но Letsencrypt, похоже, не имеет удобного способа предоставления формата PEM. Letsencrypt не имеет каких-либо специальных условий для Play Framework в отличие от Apache httpd, Tomcat или других хорошо известных платформ.

Я не хочу отключать веб-приложение, чтобы обновить сертификат SSL, используемый Pound.

Текущая конфигурация фунта

Ниже мой текущий /etc/pound/pound.cfg для фунтовой версии 2.7f-0ubuntu1. Этой конфигурации несколько лет, и, вероятно, ее нужно будет обновить, и, вероятно, также следует обновить Pound.

# Global options

User    "root"
Group   "root"

# Logging: (goes to syslog by default)
#  0  no logging
#  1  normal
#  2  extended
#  3  Apache-style (common log format)
#  4 (same as 3 but without the virtual host information)
#  5 (same as 4 but with information about the Service and BackEnd used)
LogLevel 5

# Check backend every X secs:
Alive    30

# Use hardware-accelleration card supported by openssl(1):
#SSLEngine  "<hw>"

# poundctl control socket
Control "/var/run/poundctl.socket"

# Redirect all http requests on port 80 to https on port 443
# The Play Framework webapp never sees these redirected requests because Pound handles them
ListenHTTP
  Address 0.0.0.0
  Port 80
  Err500 "/usr/local/etc/pound_error_500"
  Err503 "/usr/local/etc/pound_error_500"
  Service
    Redirect 301 "https://www.scalacourses.com"
  End
End

# Redirect all requests on port 443 to the Play Framework webapp on port 9443
ListenHTTPS
  Address 0.0.0.0
  Port 443
  Err500 "/usr/local/etc/pound_error_500"
  Err503 "/usr/local/etc/pound_error_500"
  Cert "/var/work/training/cadenza/conf/ssl/scalacourses.com.pound.pem"
  Disable SSLv3
  Ciphers "EECDH+ECDSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!eNULL:!LOW:!aNULL:!MD5:!DSS"
  SSLAllowClientRenegotiation     0
  SSLHonorCipherOrder 1
  HeadRemove "X-Forwarded-Proto"
  HeadRemove "x-forwarded-proto"
  AddHeader "x-forwarded-proto: https"
  Service
    BackEnd
      #HTTPS
      Address 127.0.0.1
      Port 9000
    End
  End
End

Вопросы

  1. Клиент certbot ACME версии 0.17.0 был установлен через: sudo apt install certbot

    я вижу это certbot версии 0.21.0 доступен. Должен ли я использовать эту более новую версию вместо версии по умолчанию, предоставляемой Ubuntu 17.10?

  2. Доступна ли разумная версия Pound в Debian PPA? Раньше мне приходилось собирать Pound самому, но я бы предпочел использовать готовую версию. https://launchpad.net/ubuntu/+source/pound есть версия 2.7-1.3 ... это лучшая стабильная версия?
  3. Какие изменения необходимо внести в конфигурацию Pound в /etc/pound/pound.cfg? Очевидно, эту строку необходимо обновить: Cert "/var/work/training/cadenza/conf/ssl/scalacourses.com.pound.pem"

    При обновлении фунта может потребоваться обновить эту строку: Ciphers "EECDH+ECDSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!eNULL:!LOW:!aNULL:!MD5:!DSS"

    Какие еще строки нужно добавить, удалить или изменить? Я знаю, что Фунт не должен бегать как root, но с этим можно разобраться отдельно.

  4. Требуется сценарий для первоначальной подготовки SSL-сертификата Letsencrypt для Pound. Кажется, что Certbot программа, используемая Letsencrypt, хочет привязаться к порту 80, но Pound привязывается к этому порту, и я не хочу отключать веб-приложение, чтобы обновить сертификат SSL. Есть ли способ запустить его на той же виртуальной машине, что и Pound, или мне следует запустить его на другой виртуальной машине и скопировать сгенерированный сертификат в формате PEM, когда он будет готов?

  5. Нужен сценарий, который можно запускать через cron каждые 45 дней, чтобы обновлять сертификаты SSL.

  1. Текущая версия certbot работает нормально, последняя не нужна.
  2. До сих пор ничего не известно о готовой версии Pound из последних источников.
  3. Мне нужно было только изменить Cert линия, что имеет смысл, потому что я (еще) не обновил Pound.
  4. Сценарий может работать на любой виртуальной машине, поскольку он не привязывается к порту 80 или 443 при использовании запроса DNS.

Ниже приводится certbot53, сценарий, который я написал для использования Jed / certbot-route53 для аутентификации через запрос DNS. Этот сценарий опирается на PR что я представил certbot-route53 это исправляет две ошибки.

#!/bin/bash

#STAGING=--staging
CERT_DIR=/etc/pound/certbot
DOMAIN=scalacourses.com
MAIL_ADDR='mslinn@scalacourses.com'
SCRIPT_NAME=certbot-route53.sh

if [ ! -d "$CERT_DIR/letsencrypt" ]; then sudo mkdir -p $CERT_DIR/letsencrypt; fi
sudo chmod 777 "$CERT_DIR/letsencrypt"

cd $CERT_DIR

if [ ! -f "$CERT_DIR/$SCRIPT_NAME" ]; then
  sudo curl -sL https://git.io/vylLx -o $SCRIPT_NAME
  sudo chmod a+x certbot-route53.sh
fi

./$SCRIPT_NAME \
  --agree-tos \
  --manual-public-ip-logging-ok \
  --domains $DOMAIN,www.$DOMAIN \
  --renew-by-default \
  --email $MAIL_ADDR $STAGING

PRIV_KEY="$CERT_DIR/letsencrypt/live/$DOMAIN/privkey.pem"
FULL_CHAIN="$CERT_DIR/letsencrypt/live/$DOMAIN/fullchain.pem"
COMBINED="$CERT_DIR/combined-for-pound.pem"
cat "$PRIV_KEY" "$FULL_CHAIN" | sudo tee "$COMBINED" > /dev/null
  1. В настоящее время я повторно запускаю тот же скрипт через задание cron. Это означает, что я не обновляю сертификаты, а заменяю их. Непонятно, какова может быть польза от обновления сертификата. Здесь cron запись, которая запускает сценарий как мой идентификатор пользователя каждые 2 месяца; Я ввел это после ввода sudo crontab -e:

    0 0 1 */2 * su mslinn /usr/local/bin/certbot53
    

Настройте небольшой httpd (Nginx, Apache ...), который прослушивает localhost (127.0.0.1:80), и сделайте каталог [DOCUMENT_ROOT] /. Well-known / acme-challenge / доступным для записи пользователю, который запускает этот httpd. Чем в конфиге фунта создать

Service "letsencrypt"
    HeadRequire "Host: .*"
    URL "/.well-known/acme-challenge/.*"
    BackEnd
        Address 127.0.0.1
        Port 80
    End
End

до всех остальных правил. Теперь у вас должно получиться что-то вроде

certbot-auto certonly --email support@example.com -d www.example.com -d example.com --verbose --agree-tos --webroot --webroot-path /var/www/localhost/htdocs/

Измените "/ var / www / localhost" на Document_root вашего локального httpd. Вам нужно сделать это только один раз. А позже вы можете сделать что-то вроде

# add --dry-run to test it certbot-auto renew --post-hook "/etc/init.d/pound restart" for i in ls /etc/letsencrypt/live/; do cp /etc/letsencrypt/live/$i/privkey.pem /opt/pound_certs/$i.pem ; cat /etc/letsencrypt/live/$i/fullchain.pem >> /opt/pound_certs/$i.pem ; done

И, конечно же, не забудьте позже добавить pem-файл в конфигурацию фунта ;-) Я знаю, что пост-хук задерживается. Однако Letsencrypt будет выдавать новые сертификаты за 10 дней до истечения срока действия старых. Так что, если вы позволяете выполнять cronjob каждый день, это вообще не проблема.