Certificato valido in UniFi Controller – UniFi Let’s Encrypt
UniFi Let’s Encrypt
Personalmente odio la notifica di errore del browser quando accedo ad una mia risorsa che ha un certificato self-signed, e specialmente sul sistema di controllo UniFi. Chi utilizza questo software nel Cloud sa bene che è possibile creare diversi siti e abilitare l’accesso ad un utente (magari il vostro cliente) per verificare lo stato degli UAP o visualizzare le statistiche.
Una cosa fastidiosa è dire al proprio cliente che deve accettare ogni volta il certificato.
Con Let’s Encrypt finalmente possiamo dire addio a questo genere di inconvenienti.
La procedura per la richiesta del certificato è identica a quella descritta in questo articolo Let’s Ecnrypt.
Occorre solamente convertire il certificato in un formato amato da UniFi (pkcs12) e metterlo nel keystore di UniFi.
Una volta generati i certificati possiamo utilizzare openssl per convertire il certificato e innestare la chiave privata nel file .p12
$ sudo openssl pkcs12 -export -inkey /etc/letsencrypt/live/ubnt.oneos.it/privkey.pem -in /etc/letsencrypt/live/ubnt.oneos.it/fullchain.pem -out /etc/letsencrypt/ubnt.oneos.it/ubnt.oneos.it.p12 -name ubnt -password pass:temppass
Una volta convertito il certificato occorre eliminare il vecchio certificato self di UniFi, accertiamoci di aver fermato il servizio UniFi.
$ cd /var/lib/unifi $ mv keystore keystore_orig
Ora creiamo un nuovo keystore con il certificato segnato da Let’s.
$ sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/keystore -srckeystore /etc/letsencrypt/live/ubnt.oneos.it/ubnt.oneos.it.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias ubnt -noprompt
Facciamo ripartire il servizio UniFi e avremo il nostro certificato segnato da Let’s.
UniFi Let’s Encrypt automazione di rinnovo
Sempre per il fatto che riscoprire l’acqua calda non ha senso, ho ripescato in rete uno script per l’automazione del rinnovo dei certificati di Let’s Encrypt, questa la URL: le_renew.
Ho però fatto delle modifiche in quanto lo script aggiorna i certificati ma non crea il pkcs12 necessario a UniFi.
#!/bin/bash #================================================================ # Let's Encrypt renewal script for Apache on Ubuntu/Debian # author Erika Heidi<erika@do.co> # Usage: ./le-renew.sh [base-domain-name] # More info: http://do.co/1mbVihI # Update # @author Federico Fiordoliva # for Unifi Controller #================================================================ domain=$1 le_path='/opt/letsencrypt' le_conf='/etc/letsencrypt' unifi_domain='YOURDOMAINNAME' exp_limit=30; get_domain_list(){ certdomain=$1 config_file="$le_conf/renewal/$certdomain.conf" if [ ! -f $config_file ] ; then echo "[ERROR] The config file for the certificate $certdomain was not found." exit 1; fi domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}") last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}') if [ "${last_char}" = "," ]; then domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}') fi echo $domains; } if [ -z "$domain" ] ; then echo "[ERROR] you must provide the domain name for the certificate renewal." exit 1; fi cert_file="/etc/letsencrypt/live/$domain/fullchain.pem" if [ ! -f $cert_file ]; then echo "[ERROR] certificate file not found for domain $domain." exit 1; fi exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s) datenow=$(date -d "now" +%s) days_exp=$(echo \( $exp - $datenow \) / 86400 |bc) echo "Checking expiration date for $domain..." if [ "$days_exp" -gt "$exp_limit" ] ; then echo "$datenow: The certificate is up to date, no need for renewal ($days_exp days left)." exit 0; else echo "$datenow: The certificate for $domain is about to expire soon. Starting renewal request..." domain_list=$( get_domain_list $domain ) "$le_path"/letsencrypt-auto certonly --apache --renew-by-default --domains "${domain_list}" # Federico add for Unifi if [ $domain = $unifi_domain ]; then /bin/mv /var/lib/unifi/keystore /var/lib/unifi/keystore_orig /usr/bin/openssl pkcs12 -export -inkey $le_conf/live/$domain/privkey.pem -in $cert_file -out $le_conf/live/$domain/$domain.p12 -name ubnt -password pass:temppass keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/keystore -srckeystore /etc/letsencrypt/live/ubnt.oneos.it/ubnt.oneos.it.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias ubnt -noprompt echo "Unifi certificate converted" echo "Restarting Unifi" /usr/sbin/service unifi restart fi # End Federico add echo "Restarting Apache..." /usr/sbin/service apache2 reload echo "$datenow: Renewal process finished for domain $domain" exit 0; fi
Aggiungete ora lo script in cron e avrete sempre il certificato valido per il vostro UniFi Controller, ma prima occorre definire un virtualhost apache per finire il processo di automazione.
Il virtualhost è necessario perché let’s encrypt può automatizzare il rinnovo solo per apache in questo momento, infatti, come dicevo nell’articolo, Le’s Encrypt occorre un server web in ascolto sulla porta 443 che presenti il token per il rinnovo.
Per creare il virtualhost potete utilizzare questo codice:
<virtualhost *:80> ServerName ubnt.oneos.it ServerAdmin webmaster@localhost DocumentRoot /var/www/html/ubnt <Directory /var/www/html/ubnt/> Options Indexes FollowSymLinks MultiViews AllowOverride all DirectoryIndex index.php Order allow,deny allow from all </Directory> RedirectMatch permanent ^/(.*) https://ubnt.oneos.it:8443/$1 </virtualhost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerName ubnt.oneos.it ServerAdmin webmaster@localhost DocumentRoot /var/www/html/ubnt RedirectMatch permanent ^/(.*) https://ubnt.oneos.it:8443/$1 <Directory /var/www/html/ubnt/> Options Indexes FollowSymLinks MultiViews AllowOverride all DirectoryIndex index.php Order allow,deny allow from all </Directory> SSLEngine on SSLCertificateFile /etc/letsencrypt/live/ubnt.oneos.it/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/ubnt.oneos.it/privkey.pem <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown ErrorLog ${APACHE_LOG_DIR}/ubnt_error.log CustomLog ${APACHE_LOG_DIR}/ubnt_access.log combined SSLCertificateChainFile /etc/letsencrypt/live/ubnt.oneos.it/chain.pem </VirtualHost> </IfModule>
Riavviate apache e avrete il virtualhost disponibile. Come possiamo vedere ho messo delle regole di rewrite che rigirano tutto il traffico per questo virtualhost, porte 80 e 443, verso la porta 8443 del controller.
UniFi Let’s Encrypt.
Enjoy!
- Coppia di chiavi RSA per ssh, come generarle - 18 Ago,2019
- Let’s Encrypt su pfSense – webConfigurator - 04 Apr,2017
- Isc Dhcpd Openldap su Ubuntu 16.04 - 03 Ott,2016
Leave a Comment