Hintergrund
Ich habe eine alte Play Framework-Webanwendung, die Assets von zwei CDNs ( siteassets
und 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.cfg
Version 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
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?
- 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?
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.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?
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
- Die aktuelle Version
certbot
funktioniert einwandfrei, die neueste Version ist nicht erforderlich. - Aus aktuellen Quellen ist mir noch immer nichts über eine vorgefertigte Version von Pound bekannt.
- Ich musste nur die
Cert
Zeile ändern, was Sinn macht, da ich Pound (noch) nicht aktualisiert habe. - 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 certbot53
ein Skript, das ich zur Verwendung geschrieben habejed/certbot-route53zur Authentifizierung per DNS-Challenge. Dieses Skript basiert auf einemPRdas ich eingereicht habe und certbot-route53
das 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
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
cron
Eintrag, der das Skript alle 2 Monate mit meiner Benutzer-ID ausführt. Ich habe dies eingegeben, nachdem ich Folgendes eingegeben hattesudo crontab -e
:0 0 1 */2 * su mslinn /usr/local/bin/certbot53