Gestione di certificati SSL per Apache con letsencrypt: Difference between revisions
Jump to navigation
Jump to search
| Line 89: | Line 89: | ||
sudoedit config.sh | sudoedit config.sh | ||
CONFIG_D=/etc/letsencrypt.sh/config | CONFIG_D=/etc/letsencrypt.sh/config.d | ||
BASEDIR=/etc/letsencrypt.sh | BASEDIR=/etc/letsencrypt.sh | ||
WELLKNOWN="/etc/letsencrypt.sh/.well-known/acme-challenge/" | WELLKNOWN="/etc/letsencrypt.sh/.well-known/acme-challenge/" | ||
Revision as of 08:08, 24 May 2016
- Vogliamo installare un certificato ssl con
- CNAME= www.example.com
- ALTN: webmail.example.com
- Il sito è servito da un webserver apache, con webroot in
- /var/www/example.com/www/html/
Procedura con letsencrypt.sh
Configurazione di Apache
- Per verificare l'attendibilità della richiesta, il server di Letsencrypt cercherà di reperire il files di verifica all'url
- Quindi bisogna creare questa risorsa sul server apache in HTTP non in https, dove dovranno essere posizionati ifiles di verifica creati da letsencrypt.sh
- Definiamo quindi questa risorsa:
sudoedit /etc/apache2/conf.d/letsencrypt.conf
- Per apache 2.4
<Directory "/etc/letsencrypt.sh/.well-known/acme-challenge/"> Options None AllowOverride None Require all granted Header add Content-Type text/plain </Directory> Alias /.well-known/acme-challenge/ /etc/letsencrypt.sh/.well-known/acme-challenge/
- Per apache 2.2
<Directory "/etc/letsencrypt.sh/.well-known/acme-challenge/">
Options None
AllowOverride None
Order deny,allow
Allow from all
</Directory>
Alias /.well-known/acme-challenge/ /etc/letsencrypt.sh/.well-known/acme-challenge/
- You need to make sure that all (sub-)domains that you want to sign have access to this directory! That includes rewrites etc.
- The acme validation is done only using plain http and will not honour redirects etc.
- Se fosse attivo un redirect HTTP-HTTPS, escludere il percorso precedente dal redirect:
RewriteEngine on
RewriteRule ^/.well-known/acme-challenge/ - [L]
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]
Installazione
- Creare uno user di sistema apposito
sudo adduser --system --force-badname letsencrypt.sh
- Creare le directories necessarie:
sudo mkdir -p /etc/letsencrypt.sh/{hooks,cron,config.d,.well-known/acme-challenge/}
sudo touch /etc/letsencrypt.sh/config.d/dummy.sh
sudo chown -R letsencrypt.sh /etc/letsencrypt.sh
- Installare le dipendenze:
sudo apt-get install curl openssl
- Installare l'eseguibile:
cd /tmp git clone https://github.com/lukas2511/letsencrypt.sh.git sudo cp letsencrypt.sh/letsencrypt.sh /usr/local/bin/
- Riavviare apache e testare se la directory sia servita:
sudo systemctl restart apache2.service wget -O - http://www.example.com/.well-known/acme-challenge/
Configurazione
- Modificare la configurazione:
cd /etc/letsencrypt.sh/
sudoedit config.sh
CONFIG_D=/etc/letsencrypt.sh/config.d BASEDIR=/etc/letsencrypt.sh WELLKNOWN="/etc/letsencrypt.sh/.well-known/acme-challenge/" CONTACT_EMAIL=admin@example.com
- Creare il wrapper che sarà eseguito da cron pre rinnovare i certificati:
sudoedit cron/letsencrypt.cron.sh
#!/bin/bash cd /etc/letsencrypt.sh /usr/local/bin/letsencrypt.sh --cron
- Renderlo eseguibile:
sudo chmod +x cron/letsencrypt.cron.sh
- Sistemare i diritti dei files creati:
sudo chown -R letsencrypt.sh /etc/letsencrypt.sh
- Creare il file contenente i certificati da richiedere
cd /etc/letsencrypt.sh
sudoedit domains.txt
www.example.com example.com
- Testarlo:
sudo -u letsencrypt.sh /etc/letsencrypt.sh/cron/letsencrypt.cron.sh
- Se tutto funziona, i certificati saranno in
/etc/letsencrypt.sh/certs/www.example.com/
- privkey.pem è la private key
- fullchain.pem è il certificato concatenato con le CA
- cert.pem è il certificato standalone
- Creare il file di cron
sudoedit /etc/cron.d/letsencrypt
01 11 * * * letsencrypt.sh /etc/letsencrypt.sh/cron/letsencrypt.cron.sh > /dev/null
- Copiamo i certificati manualmente per essere usati da Apache:
sudo cp -i /etc/letsencrypt.sh/certs/www.example.com/fullchain.pem /etc/ssl/certs/www.example.com.crt sudo cp -i /etc/letsencrypt.sh/certs/www.example.com/privkey.pem /etc/ssl/private/www.example.com.key
- Installare la CA:
sudo cp -i /etc/letsencrypt.sh/certs/www.example.com/chain.pem /usr/local/share/ca-certificates/letsencrypt.org.crt sudo update-ca-certificates
- Verificare che sia presente:
ls /etc/ssl/certs/letsencrypt.org.pem
lrwxrwxrwx 1 root root 52 Feb 29 10:16 /etc/ssl/certs/letsencrypt.org.pem -> /usr/local/share/ca-certificates/letsencrypt.org.crt
Configurazione del Virtualhost HTTPS
- I certificati verranno utilizzati in apache come:
SSLCertificateKeyFile /etc/ssl/private/www.example.com.key SSLCertificateFile /etc/ssl/certs/www.example.com.crt SSLCertificateChainFile /etc/ssl/certs/www.example.com.crt
- Riavviare Apache e testare l'acesso in HTTPS:
sudo /etc/init.d/apache2 restart
- Testare la qualità del certificato: https://www.ssllabs.com/ssltest/
Script di deploy dei certificati
- Ora letsencrypt.sh provvederà rinnovare il certificato quando avrà meno di 30 giorni di validità. Dobbiamo implementare il meccanismo con cui i certificati vengono ricaricati in Apache al loro rinnovo
- I certificati dovranno essere spostati nelle relative directory sotto /etc/ssl
- Creiamo un altro script, che dovrà esere eseguito come root, che confronta i certificati in uso con quelli
sudoedit /etc/letsencrypt.sh/hooks/deploy.sh
#!/bin/bash
#
# MUST BE RUN AS ROOT
#
BASEDIR="/etc/letsencrypt.sh"
SSLDIR="/etc/ssl"
CERTS=$(/bin/ls -x ${BASEDIR}/certs/)
for CERT in $CERTS
do
# Check if the certificate has changed
if !(diff -q ${BASEDIR}/certs/${CERT}/fullchain.pem ${SSLDIR}/certs/${CERT}.crt > /dev/null)
then
echo "Certificate for ${CERT} has been renewed."
cp -L "${BASEDIR}/certs/${CERT}/privkey.pem" "${SSLDIR}/private/${CERT}.key"
cp -L "${BASEDIR}/certs/${CERT}/fullchain.pem" "${SSLDIR}/certs/${CERT}.crt"
chmod 400 "${SSLDIR}/private/${CERT}.key"
chmod 644 "${SSLDIR}/certs/${CERT}.crt"
# Restart relevant services
# [[ "${jail}" = "http" ]] && jexec ${jail} service apache24 restart
#[[ "${jail}" = "mail" ]] && jexec ${jail} service smtpd restart
/etc/init.d/apache2 restart > /dev/null
# Clean up old keys and certs
sudo -u letsencrypt.sh /usr/local/bin/letsencrypt.sh --cleanup > /dev/null
fi
done
- Renderlo eseguibile, e testarlo: non deve fare nulla:
sudo chmod a+x /etc/letsencrypt.sh/hooks/deploy.sh
sudo /etc/letsencrypt.sh/hooks/deploy.sh
- Impostarne l'esecuzione COME ROOT subito dopo il lancio di letsencrypt. Attenzione: viene usato sudo nello script:
sudoedit /etc/cron.d/letsencrypt
11 11 * * * root /etc/letsencrypt.sh/hooks/deploy.sh
Riferimenti
Procedura con acme-tiny
| Attenzione questo articolo è ancora incompleto. Sentiti libero di contribuire cliccando sul tasto edit. |
openssl req -new -sha256 -key domain.key -subj "/CN=www.rvmgroup.it" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:www.rvmgroup.it,DNS:support.rvmgroup.it,DNS:smtp.rvmgroup.it,DNS:webmail.rvmgroup.it")) |sudo tee domain.csr openssl req -in domain.csr -text -noout sudo python /opt/acme-tiny/acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/rvmgroup.it/www/html/.well-known/acme-challenge/ | sudo tee ./signed.crt openssl x509 -in signed.crt -text -noout wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem | sudo tee intermediate.pem cat signed.crt intermediate.pem | sudo tee chained.pem