Pound + Letsencrypt для Play Framework и AWS CloudFront

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 для веб-приложения. Сертификаты Letsencrypt действительны только 90 дней, поэтому их необходимо автоматически обновлять.

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

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

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

Ниже приведена моя текущая /etc/pound/pound.cfgверсия для Pound 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. Какие изменения необходимо внести в конфигурацию фунта в /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"

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

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

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

решение1

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

Сервис "letsencrypt"
    HeadRequire "Хост: .*"
    URL "/.well-known/acme-challenge/.*"
    БэкЭнд
        Адрес 127.0.0.1
        Порт 80
    Конец
Конец

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

certbot-auto certonly --email [email protected] -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 каждый день, то это вообще не проблема.

решение2

  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='[email protected]'
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 job. Это означает, что я не обновляю сертификаты, а заменяю их. Неясно, в чем может быть выгода от обновления сертификата. Вот запись cron, которая запускает скрипт от моего userid каждые 2 месяца; я ввел это после ввода sudo crontab -e:

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

Связанный контент