У меня есть старое веб-приложение 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
Клиент certbot ACME версии 0.17.0 был установлен через:
sudo apt install certbot
я вижу это certbot версии 0.21.0 доступен. Должен ли я использовать эту более новую версию вместо версии по умолчанию, предоставляемой Ubuntu 17.10?
Какие изменения необходимо внести в конфигурацию 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
, но с этим можно разобраться отдельно.
Требуется сценарий для первоначальной подготовки SSL-сертификата Letsencrypt для Pound. Кажется, что Certbot программа, используемая Letsencrypt, хочет привязаться к порту 80, но Pound привязывается к этому порту, и я не хочу отключать веб-приложение, чтобы обновить сертификат SSL. Есть ли способ запустить его на той же виртуальной машине, что и Pound, или мне следует запустить его на другой виртуальной машине и скопировать сгенерированный сертификат в формате PEM, когда он будет готов?
Нужен сценарий, который можно запускать через cron каждые 45 дней, чтобы обновлять сертификаты SSL.
certbot
работает нормально, последняя не нужна.Cert
линия, что имеет смысл, потому что я (еще) не обновил Pound.Ниже приводится 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
В настоящее время я повторно запускаю тот же скрипт через задание 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 каждый день, это вообще не проблема.