Unify + SSL
Sieć
Jakiś czas temu, przy okazji przeprowadzki, miałem dylemat na temat setupu sieci domowej. Ostatecznie zdecydowałem sie na ecosystem Unify w skład którego wchodzi router Unify Cloud Gateway Ultra, 2x Access Point: U6 Pro oraz switch z PoE USW-Ultra. Mam nadzieję, że te linki nie przestaną działać 😅.
A wracając do głównego wątku, nie chciałem od razu inwestować za dużo, nie wiedząc jak sprzęt się będzie sprawować. Póki co taki setup jest wystarczający dla moich potrzeb i w teorii powinien być w stanie w obsłużyć nawet kilkaset urządzeń. Jeden z elementów, który był dla mnie istotny to VPN. Router od unify pozwala na skonfigurowanie serwera VPN i łączenie się z siecią domową z dowolnego miejsca. I był to jeden z kluczowych czynników, który przeważył przy wyborze sprzętu.
Do kompletu dochodzi internet światłowodowy od pomarańczowej / niebiesko-żółtej sieci 😏. I możliwość zostawienia funboxa w szafie korzystając z dołączonego ONT. Dzięki czemu mogłem ominąć podwójny NAT i mieć pełną kontrole nad routerem.
Domena, Cloudflare i certyfikaty
Spinając to wszystko do kupy, zdecydowałem, że potrzebuje mieć domenę (internet ma dynamiczne adres IP). Mógłbym korzystać z jakichś bezpłatnych/płatnych usług DynDNS. Ale domena otwiera nowe możliwości. Kupiłem jakoś prostą domenę w ovh, przeniosłem serwery DNS do cloudflare i moge teraz tworzyć w stosunkowo prosty sposób certyfikaty. Cloudflare ma dosyć wygodne API z którym wielu dostawców jest zsynchronizowana.
Między innymi DynDNS może być realizowany przez Unify
To rozwiązuje od razu jeden problem. Kolejny natury troche bardziej estetyczne, to możliwość logowania się do routera, poprzez adres łatwy do zapamiętania adres. Adres, który również będzie wykorzystany dla klientów VPN, aby się łączyć z siecią domową. Tutaj mógłbym użyć darmowych rozwiązań DynDNS, z których początkowo korzystałem. Jednak, gdy zacząłem nieco rozbudowywac usługi wewnątrz sieci domowej i zacząłem mieć serwisy w stylu NAS, home assistant, etc. Własna domena i łatwe do zapamiętania adres wydały się lepszym rozwiązaniem. Chciałem im skonfigurować certyfikaty SSL, aby przeglądarki nie marudziły jak próbuję cokolwiek wczytać w sieci domowej. I tutaj pojawiały się 2 opcje.
Albo będę generował jakąś własną domenę z końcówką typu .lan czy .local np nas.lan i wykorzystam wygenerowane przez siebie certyfikaty. Jednak jest to nieco bardziej upierdliwa opcja. Należy dodawać na każdym urządzeniu, które będzie je wczytywać, dodatkowego zaufanego dostawcę certyfikatów. Początkowo stworzyłem tak kilka domen, ale nie byłem w pełni zadowolony z tego rozwiązania.
Albo kupię domenę i zacznę generować certyfikaty samodzielnie, najlepiej przy pomocy bezpłatnego dostawcy jakim jest Let’s Encrypt. I to jest to rozwiązanie, z którego obecnie korzystam.
Czy można mieć certyfikat z Unify?
Unify pozwala w panelu na upload własnego certyfikatu, jednak jest to więcej niż pewne, że kiedyś o tym zapomnę. Natomiast mamy też opcję logowania się po ssh na router, a pod spodem znajduje się jakiś unixowy system. A to pozwala na pewną dozę automatyzacji. Zawsze można coś doinstalować, czy mieć innego cron’a co wykona za nas czynności automatycznie.
Router
Inspirowany tym wpisem na blogu postanowiłem sprawdzić czy setup zadziała. I początkowo wszystko działało (a było to kilka miesięcy temu), i zapewne zapomniałbym, że w ogóle stawiałem tą konfigurację. Gdyby nie fakt, że coś przestało działać niedawno 🙈 i musiałem wszystko odkopywać znowu. Także, zostawiam sobie notatkę jak to wszystko skonfigurowałem, aby móc kiedyś wrócić jeśli zajdzie taka potrzeba. Podejrzewam, że któryś update systemu mógł popsuć cron’a. Po zalogowaniu po ssh, lista zadań w cron była pusta. Albo coś skonfigurowałem nieprawidłowo i po prostu certyfikat mi wygasł i się nigdy nie odnowił. W każdym razie uzbrojony w poprzednie doświadczenie oraz AI 🤖 sprawdziłem co się da zrobić.
Konfiguracja
Po pierwsze należało zainstalować acme.sh, jako email podaj adres, który będzie wykorzystany przy rejestrowaniu certyfikatów w Let’s encrypt
curl https://get.acme.sh | sh -s {email}
Następnie w oryginalnym poście, była mowa o patchu niezbędnym dla Unify, ale coś mi w nim nie działało. Uzytkownicy w komentarzach wskazywali kolejne sposoby rozwiązania. Nie pamiętam już, czy z któregoś z nich skorzystałem. Wiem, że na tym etapie coś mi nie działało, więc chyba pominąłem ten krok i przeszedłem dalej.
Ustanowiłem zmienne z kluczami wygenerowanymi w Cloudflare. W tym przypadku używany był DNS-01 challenge, aby potwierdzić, że jestem właścicielem domeny. Czyli podczas generowania certyfikatu, acme ustanawia tymczasowy wpis TXT w DNS, który potwierdza, że posiadam dostęp do edycji DNS. Stąd potrzeba wygenerowania API key.
Stworzyłem testowy certyfikat, aby sprawdzić czy proces działa:
acme.sh --issue --keylength 2048 --dns dns_cf -d {example.com} --deploy-hook unifi --debug --test
Nie wiem czy ten hook unify jest potrzebny czy nie, przekonamy się za jakieś 3 miesiące 🙃.
W toku konsultowania tego rozwiązania z AI, dostałem bardzo ciekawy sposób kontynuacji całego procesu, który nie był przedstawiony w oryginalnym poście. Certyfikaty w routerze znajdują się w konkretnym folderze i można “poprosić” acme.sh, aby zainstalowało je z odpowiednimi nazwami w konkretnym miejscu. Do czego służy komenda acme.sh --install-cert. Takze miejsce gdzie znajdują się owe certyfikaty to:
/data/unifi-core/config/unifi-core.crt
/data/unifi-core/config/unifi-core.key
Najpierw zrobiłem im kopie zapasową:
cp /data/unifi-core/config/unifi-core.crt /data/unifi-core/config/unifi-core.crt.bak
cp /data/unifi-core/config/unifi-core.key /data/unifi-core/config/unifi-core.key.bak
Następnie wykonałem komendę:
acme.sh --install-cert -d {example.com} \
--cert-file /data/unifi-core/config/unifi-core.crt \
--key-file /data/unifi-core/config/unifi-core.key \
--fullchain-file /data/unifi-core/config/unifi-core.crt \
--reloadcmd "systemctl restart nginx"
I voila. Po przejściu na stronę routera mam działająca domenę w pełni wspierającą HTTPS. Pozostaje teraz czekać i sprawdzić na ile trwała będzie to zmiana. Mam nadzieję, że certyfikat odświeży się, gdy będzie mu się zbliżać czas wygaśnięcia. Trzymajcie kciuki. 💪 A jeśli nie, to pojawi się tutaj jakiś update.