Pfund + Letsencrypt für Play Framework und AWS CloudFront

Pfund + Letsencrypt für Play Framework und AWS CloudFront

Hintergrund

Ich habe eine alte Play Framework-Webanwendung, die Assets von zwei CDNs ( siteassetsund courseassets) bereitstellt, die mit AWS CloudFront implementiert sind.Pfundläuft auf derselben VM wie die Webanwendung und fungiert lediglich als SSL-Endpunkt, da die alte Version des verwendeten Play Frameworks kein SSL unterstützt. Pound ist an Port 80 und 443 gebunden. Die Play-Webanwendung ist an Port 9000 gebunden.

Zuvor habe ich ein Symantec SSL-Wildcard-Zertifikat für die CDN-Assets und die Webanwendung verwendet. Da Symantec SSL-Zertifikate jetzt nur noch wenige Tage gültig sind, habe ich beschlossen, AWS Certificate Manager zu verwenden, um Single-Domain-SSL-Zertifikate für die CDNs bereitzustellen, und Letsencrypt zu verwenden, um ein Single-Domain-SSL-Zertifikat für die Webanwendung bereitzustellen. Die Letsencrypt-Zertifikate sind nur 90 Tage gültig und müssen daher automatisch aktualisiert werden.

Pound möchte SSL-Zertifikate im PEM-Format, aber Letsencrypt scheint keine praktische Möglichkeit zu haben, ein PEM-Format bereitzustellen. Letsencrypt hat keine spezielle Vorkehrung für Play Framework, wie dies bei Apache httpd, Tomcat oder anderen bekannten Frameworks der Fall ist.

Ich möchte die Webanwendung nicht offline nehmen, um das von Pound verwendete SSL-Zertifikat zu aktualisieren.

Aktuelle Pfund-Konfiguration

Nachfolgend finden Sie meine aktuelle /etc/pound/pound.cfgVersion für Pound 2.7f-0ubuntu1. Diese Konfiguration ist einige Jahre alt und muss wahrscheinlich aktualisiert werden. Pound sollte wahrscheinlich ebenfalls aktualisiert werden.

# 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

Fragen

  1. Der Certbot ACME-Client Version 0.17.0 wurde installiert über: sudo apt install certbot

    Ich sehe dascertbot Version 0.21.0ist verfügbar. Soll ich diese neuere Version anstelle der Standardversion von Ubuntu 17.10 verwenden?

  2. Gibt es eine vernünftige Version von Pound in einem Debian-PPA? Bisher musste ich Pound selbst erstellen, aber ich würde lieber eine vorgefertigte Version verwenden.https://launchpad.net/ubuntu/+source/poundhat Version 2.7-1.3 ... ist das die beste stabile Version?
  3. Welche Änderungen sind an der Pound-Konfiguration in erforderlich /etc/pound/pound.cfg? Diese Zeile muss eindeutig aktualisiert werden: Cert "/var/work/training/cadenza/conf/ssl/scalacourses.com.pound.pem"

    Diese Zeile muss möglicherweise aktualisiert werden, wenn das Pfund aktualisiert wird: 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"

    Welche anderen Zeilen müssen möglicherweise hinzugefügt, gelöscht oder geändert werden? Ich weiß, dass Pound nicht als ausgeführt werden sollte root, aber das kann separat behandelt werden.

  4. Brauche ein Skript, um das Letsencrypt SSL-Zertifikat für Pound zunächst bereitzustellen. Es scheint, dass dasZertifikatbotDas von Letsencrypt verwendete Programm möchte an Port 80 gebunden werden, aber Pound bindet an diesen Port, und ich möchte die Webanwendung nicht herunterfahren, um das SSL-Zertifikat zu aktualisieren. Gibt es eine Möglichkeit, es auf derselben VM wie Pound auszuführen, oder sollte ich es auf einer anderen VM ausführen und das generierte Zertifikat im PEM-Format kopieren, wenn es fertig ist?

  5. Benötigen Sie ein Skript, das alle 45 Tage per Cron aufgerufen werden kann, um die SSL-Zertifikate zu aktualisieren.

Antwort1

Richten Sie einen kleinen httpd (Nginx, Apache...) ein, der auf localhost (127.0.0.1:80) lauscht und machen Sie das Verzeichnis [DOCUMENT_ROOT]/.well-known/acme-challenge/ für den Benutzer beschreibbar, der diesen httpd ausführt. Erstellen Sie dann in der Pfund-Konfiguration

Dienst "letsencrypt"
    HeadRequire "Host:.*"
    URL „/.well-known/acme-challenge/.*“
    BackEnd
        Adresse 127.0.0.1
        Anschluss 80
    Ende
Ende

vor allen anderen Regeln. Jetzt sollten Sie in der Lage sein, etwas zu tun wie

certbot-auto certonly --email [email protected] -d www.example.com -d example.com --verbose --agree-tos --webroot --webroot-path /var/www/localhost/htdocs/

Bitte ändern Sie "/var/www/localhost" in das Document_root Ihres lokalen httpd. Sie müssen dies nur einmal tun. Und später können Sie so etwas tun wie

# 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

Und natürlich nicht vergessen, die PEM-Datei später in die Pound-Konfiguration einzufügen ;-) Ich weiß, dass der Post-Hook zu spät kommt. Letsencrypt stellt jedoch 10 Tage vor Ablauf der alten Zertifikate neue aus. Wenn Sie das also jeden Tag als Cronjob erledigen lassen, ist das überhaupt kein Problem.

Antwort2

  1. Die aktuelle Version certbotfunktioniert einwandfrei, die neueste Version ist nicht erforderlich.
  2. Aus aktuellen Quellen ist mir noch immer nichts über eine vorgefertigte Version von Pound bekannt.
  3. Ich musste nur die CertZeile ändern, was Sinn macht, da ich Pound (noch) nicht aktualisiert habe.
  4. Das Skript kann auf jeder VM ausgeführt werden, da es bei Verwendung einer DNS-Challenge nicht an Port 80 oder Port 443 gebunden ist.

Nachfolgend finden Sie certbot53ein Skript, das ich zur Verwendung geschrieben habejed/certbot-route53zur Authentifizierung per DNS-Challenge. Dieses Skript basiert auf einemPRdas ich eingereicht habe und certbot-route53das zwei Fehler behebt.

#!/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. Derzeit führe ich dasselbe Skript über einen Cron-Job erneut aus. Das bedeutet, dass ich die Zertifikate nicht aktualisiere, sondern ersetze. Unklar ist, welchen Nutzen die Aktualisierung eines Zertifikats haben könnte. Hier ist der cronEintrag, der das Skript alle 2 Monate mit meiner Benutzer-ID ausführt. Ich habe dies eingegeben, nachdem ich Folgendes eingegeben hatte sudo crontab -e:

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

verwandte Informationen