Cover Image

Sette opp Let's Encrypt-sertifikat for bruk på Ubiquiti wifikontroller

 Tue 2019-12-10    Ubiquiti

UWC kommer som standard med en egensignert SSL-sertifikat som i seg selv ikke er mer eller mindre trygt enn andre SSL-sertifikater med tanke på kryptering av data, men det er ikke trusted noe sted og derfor blir det langdryg sutring fra nettlesere hver gang man skal inn og administrere kontrolleren.

Etter at Let's Encrypt kom på banen og begynte å tilby gratis SSL-sertifikater for alle og enhver helt gratis, er det dog vesentlig mye enklere å få sikret ymse tjenester man drifter uten at det koster skjorten.

Steg 1: Sett opp en server for å hoste Unifi-kontrolleren

Jeg valgte å sette opp en Ubuntu-server for å kjøre Unifi-serveren for å slippe Windows-lisensieringskostnader og telemetri-pisset Microsoft holder på med.

Unifi ble installert slik:

  1. Installer nødvendige pakker før du begynner:
    $ sudo apt update && sudo apt install ca-certificates apt-transport-https
  2. Kjør følgende kommando for å legge til ny source list (alt på én linje):
    $ echo 'deb https://www.ui.com/downloads/unifi/debian stable ubiquiti' | sudo tee /etc/apt/sources.list.d/100-ubnt-unifi.list
  3. Legg til GPG-nøklene.
    For Ubuntu 18.04: kjør følgende kommandoer før du installerer UniFi i steg 4:
    $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
    $ echo "deb https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
    $ sudo apt update
    Installer følgende trusted key til /etc/apt/trusted.gpg.d:
    $ sudo wget -O /etc/apt/trusted.gpg.d/unifi-repo.gpg https://dl.ui.com/unifi/unifi-repo.gpg
  4. Installer og oppgrader UniFi-kontrolleren:
    $ sudo apt update && sudo apt install unifi

Etter installasjonen bør du kunne se innloggingssiden ved å gå til https://din-ip:8443.

Du vil da få beskjed om at sertifikatet ikke er til å stole på og yada yada. På tide å få satt opp et skikkelig sertifikat, med andre ord.

Steg 2: Generere et signert sertifikat med Let's Encrypt

Det første vi må gjøre er å installere Let's Encrypt i form av certbot. I gamle dager måtte man luske rundt for å finne programmet, men i dag er det så enkelt som dette:

$ sudo apt install certbot

Etter installasjonen spør vi om å få et sertifikat:

$ sudo certbot certonly

Velg alternativ 1 (spin up a temporary server), skriv inn mailadressen din (for å få beskjed hvis noe slutter å funke), samtykk til avtaleteksten ingen leser og skriv til slutt inn domenenavnet du vil ha et sertifikat for (f.eks. unifi.example.com). Hvis alt funket som det skulle skal du få en gratulasjonsmelding og vi kan gå videre. Hvis du fikk feilmeldinger, finn ut hva som gikk galt og fiks det.

Steg 3: Legg inn sertifikatet i UniFi-tjenesten

Sertifikatet vi har fått er bare et sertifikat og er ikke installert noe sted. Certbot har plugins for å automatisk installere sertifikater i Apache og NGINX-configfiler, men ikke UniFi-tjenestene. Ubiquiti-tjenestene er Java-baserte og bruker derfor Java Keystore for å lagre private krypteringsnøkler og sertifikater. For å installere sertifikatet vårt til Keystore må det først konverteres til PKCS#12-format. Det gjøres veldig enkelt på denne måten (alt på en lnje):

$ sudo openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/unifi.example.com/privkey.pem \ -in /etc/letsencrypt/live/unifi.example.com/fullchain.pem \
-out /tmp/cert.p12 \
-name unifi \ -password pass:temppass

Ikke glem å erstatte unifi.example.com med ditt faktiske domenenavn. Resten kan være som det er.

Nå er vi klare til å legge inn PKCS#12-sertifikatet i Keystore (igjen, alt på én linje):

$ sudo keytool -importkeystore -deststorepass aircontrolenterprise \
-destkeypass aircontrolenterprise \ -destkeystore /var/lib/unifi/keystore \
-srckeystore /tmp/cert.p12 -srcstoretype PKCS12 \
-srcstorepass temppass -alias unifi -noprompt

Til slutt kan PKCS#12-sertifikatet slettes (siden det allerede er importert og det ikke er god form å la sertifikatfiler slenge rundt), og start UniFi-tjenesten på nytt:

$ sudo rm /tmp/cert.p12
$ sudo /etc/init.d/unifi restart

Det er i all hovedsak det man trenger å gjøre. Gå tilbake til innloggingssiden for kontrolleren og se at du nå har et gyldig sertifikat, og at nettleseren har sluttet å sutre :)

Steg 4: Automatisering av Let's Encrypt sertifikatfornyelse

Ulempen med LE-sertifikater er at de bare har en gyldighet på 3 måneder. Vi må derfor fornye sertifikatet før det utløper. Av denne grunn må vi sette opp maskinen til å forsøke å fornye sertifikatet en gang i uken og så kopiere et eventuelt nytt sertifikat inn i Keystore og starte tjenesten på nytt. I all hovedsak vil del 2 og 3 utføres automatisk en gang i uken via cron. Ukentlig kan kanskje se mye ut, men tatt i betraktning at reverseproxyen min forsøker renewal to ganger i døgnet er en gang i uken helt greit.

For å få dette til oppretter vi et enkelt script under /root/bin/renew_lets_encrypt_cert.sh og legger enkelt og greit inn kommandoene vi brukte i del 2 og 3.

Det skal sies at dette er et veldig brutalt script som ikke har noen som helst form for sjekk eller feilhåndtering, så hvis noe knekker, så knekker det hardt. Det bør virkelig skrives om til noe som sjekker etter mtime eller noe på sertifikatet for å unngå å stappe det samme sertifikatet inn i Keystore, og unngå å starte tjenestene på nytt unødvendig.

# Forny sertifikatet fra LetsEncrypt
/usr/bin/certbot renew --quiet --no-self-upgrade

# Konverter sertifikatet til PKCS#12-format
/usr/bin/openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/mysubdomain.mydomain.com/privkey.pem \
-in /etc/letsencrypt/live/mysubdomain.mydomain.com/fullchain.pem \
-out /tmp/cert.p12 -name unifi -password pass:temppass # Importer sertifikatet til Java Keystore som UBNT forstår /usr/bin/keytool -importkeystore -deststorepass aircontrolenterprise \ -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/keystore \ -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt # Rydd opp og start tjenesten på nytt for å bruke det nye sertifikatet rm /tmp/cert.p12 /etc/init.d/unifi restart

Gjør scriptet kjørbart

$ sudo chmod +x /root/bin/renew_lets_encrypt_cert.sh

Legg inn scriptet i crontab slik at det kjøres regelmessig. Kjør sudo crontab -e og legg inn følgende i slutten av filen:

1 1 * * 1 /root/bin/renew_lets_encrypt_cert.sh

Dette kjører en fornyelse av sertifikatet hver mandag klokken 01:01.

NB: For at dette i det hele tatt skal virke, må serveren UniFi-kontrolleren kjører på ha port 80 og 443 åpne for at verifiseringen av sertifikatet skal gjennomføres. Dersom maskinen står bak en reverse proxyserver, må denne ha åpnet port 80 og 443 til serveren UniFi-kontrolleren kjører på. Hvis port 80 og 443 ikke er åpne vil ikke verken utstedelse eller fornyelse av sertifikatene kunne gjennomføres, og da må man gjøre alt over manuelt etter å ha åpnet portene.