SSL certifikát pre subdoménu pomocou Mailcow

V tomto návode si ukážeme, ako sprístupniť lokálnu Docker aplikáciu prostredníctvom vlastnej subdomény a zabezpečiť ju SSL certifikátom Let’s Encrypt pomocou Mailcow.
Ako príklad použijeme aplikáciu bežiacu lokálne na:
10.10.8.4:3080
ktorú chceme sprístupniť prostredníctvom adresy:
https://video.ibasterisk.eu
Mailcow Nginx bude v tomto prípade slúžiť ako reverse proxy a kontajner acme-mailcow zabezpečí vystavenie a obnovovanie SSL certifikátu.
Vytvorenie DNS
Ako prvé vytvoríme DNS záznam u poskytovateľa, ktorý spravuje DNS zónu našej domény.
Pre subdoménu:
video.ibasterisk.eu
vytvoríme DNS záznam smerujúci na verejnú IP adresu servera, cez ktorý bude aplikácia dostupná z internetu.
V mojom prípade subdoména video.ibasterisk.eu smeruje na verejnú IP adresu:
109.230.12.223

Port forwarding
Následne musíme zabezpečiť, aby požiadavky z internetu na portoch 80 a 443 smerovali na server, na ktorom beží Mailcow Nginx.
Samotná aplikácia Video beží v mojom prípade na:
10.10.8.4:3080
Port 3080 však nie je potrebné publikovať priamo do internetu. Verejná HTTP/HTTPS komunikácia smeruje najskôr na Mailcow Nginx a až ten následne požiadavku presmeruje na interný port aplikácie.
Komunikácia teda vyzerá nasledovne:
Internet
↓
109.230.12.223:80 / :443
↓
FortiGate
↓
10.10.8.4:80 / :443
↓
Mailcow Nginx
↓
server_name video.ibasterisk.eu
↓
reverse proxy
↓
10.10.8.4:3080
↓
Video Docker
Na FortiGate prejdeme do:
Policy & Objects → Virtual IPs
a následne zvolíme:
Create New
Vytvoríme pravidlo, ktoré presmeruje komunikáciu z verejnej IP adresy na internú IP adresu servera s Mailcow.


Následne nastavíme parametre Virtual IP pravidla podľa našej sieťovej konfigurácie.
Príklad nastavenia port forwardingu:

Následne prejdeme do:
Policy & Objects → Firewall Policy

V mojom prípade mám pravidlá rozdelené do blokov a subdomény smerujúce cez Mailcow mám zaradené pod pravidlo pre mail server.
Otvoríme príslušné pravidlo pomocou Edit, pridáme vytvorený Virtual IP objekt a zmeny potvrdíme pomocou Apply.




Kontrola DNS
Keď máme DNS záznam vytvorený, môžeme si pomocou terminálu overiť, či sa subdoména správne prekladá na verejnú IP adresu.
Použijeme príkaz:
nslookup video.ibasterisk.eu
V mojom prípade dostaneme napríklad:
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: video.ibasterisk.eu
Address: 109.230.12.223
Ak sa nový DNS záznam ešte nezobrazuje, je potrebné chvíľu počkať. Propagácia DNS môže trvať niekoľko minút, v niektorých prípadoch aj dlhšie.
Príprava SSL certifikátu prostredníctvom Mailcow
Odporúčanie
Pre jednoduchšiu administráciu a úpravu konfiguračných súborov odporúčam používať textový editor Vim.
Ak ho nemáme nainštalovaný, môžeme ho doinštalovať pomocou:
sudo apt update
sudo apt install vim
Základné príkazy Vim
i vstup do režimu editácie
Esc ukončenie režimu editácie
dd zmazanie celého riadku
/slovo vyhľadanie textu
n ďalší výsledok vyhľadávania
N predchádzajúci výsledok vyhľadávania
:set number zapnutie číslovania riadkov
:wq uloženie súboru a ukončenie Vim
:q! ukončenie Vim bez uloženia zmien
Ak si chceme pri editovaní zobraziť čísla riadkov, vo Vim použijeme:
:set number
Výsledok môže vyzerať napríklad takto:
1 server {
2 listen 80;
3 listen [::]:80;
4 listen 443 ssl;
5 listen [::]:443 ssl;
6
7 server_name christmas.ibasterisk.eu ... video.ibasterisk.eu;
8
9 ssl_certificate /etc/ssl/mail/cert.pem;
10
Pridanie subdomény do mailcow.conf
Najskôr prejdeme do adresára, v ktorom máme nainštalovaný Mailcow:
cd /opt/mailcow-dockerized
Otvoríme hlavný konfiguračný súbor:
sudo vim mailcow.conf
Vo Vim môžeme vyhľadať položku:
ADDITIONAL_SAN=
pomocou:
/ADDITIONAL_SAN=
Do existujúceho zoznamu pridáme na koniec, oddelenú čiarkou a bez medzery, novú subdoménu:
video.ibasterisk.eu
Výsledok môže vyzerať napríklad:
ADDITIONAL_SAN=mail.ibasterisk.eu,cv.ibasterisk.eu,music.ibasterisk.eu,christmas.ibasterisk.eu,chat.ibasterisk.eu,halloween.ibasterisk.eu,ibasterisk.eu,moto.ibasterisk.eu,video.ibasterisk.eu
ADDITIONAL_SAN určuje ďalšie DNS názvy, ktoré majú byť zahrnuté do SSL certifikátu Mailcow.
Zmeny uložíme pomocou:
:wq
Pridanie subdomény do Nginx reverse proxy
V mojom prostredí používam vlastný Nginx konfiguračný súbor pre ďalšie aplikácie:
/opt/mailcow-dockerized/data/conf/nginx/00-custom-apps.conf
Názov vlastného konfiguračného súboru sa môže v inom prostredí líšiť.
Súbor otvoríme:
sudo vim /opt/mailcow-dockerized/data/conf/nginx/00-custom-apps.conf
Subdoménu video.ibasterisk.eu pridáme medzi domény, ktoré má tento Nginx server obsluhovať, napríklad:
server_name christmas.ibasterisk.eu cv.ibasterisk.eu music.ibasterisk.eu chat.ibasterisk.eu halloween.ibasterisk.eu ibasterisk.eu moto.ibasterisk.eu video.ibasterisk.eu;
Následne nastavíme port, na ktorom beží samotná aplikácia:
if ($host = "video.ibasterisk.eu") {
set $target_port "3080";
}
A požiadavku odošleme na lokálnu Docker aplikáciu:
proxy_pass http://10.10.8.4:$target_port;
Súbor opäť uložíme pomocou:
:wq
Aplikovanie zmeny v Mailcow
Po zmene mailcow.conf spustíme:
cd /opt/mailcow-dockerized
sudo docker compose up -d
Mailcow tým aplikuje zmenenú konfiguráciu. Tento krok odporúča aj oficiálna dokumentácia po úprave ADDITIONAL_SAN.
Spustenie ACME klienta
Teraz môžeme nechať Mailcow znovu spustiť ACME klienta:
sudo docker compose restart acme-mailcow
acme-mailcow skontroluje požadované domény a pri úspešnom overení vystaví nový Let’s Encrypt certifikát obsahujúci aj:
video.ibasterisk.eu
Priebeh sledujeme v druhom termináli:
sudo docker compose logs --tail=200 -f acme-mailcow
Sledovanie logu ukončíme pomocou:
CTRL + C
Reštart Nginx
Po získaní certifikátu môžeme načítať konfiguráciu Nginx:
sudo docker compose restart nginx-mailcow
Po reštarte Nginx by mala byť aplikácia dostupná prostredníctvom zabezpečenej HTTPS adresy:
https://video.ibasterisk.eu

Overenie SSL certifikátu
Najjednoduchšie:
curl -I https://video.ibasterisk.eu
Alebo si môžeme pozrieť priamo certifikát:
echo | openssl s_client \
-connect video.ibasterisk.eu:443 \
-servername video.ibasterisk.eu 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
A všetky názvy zahrnuté v certifikáte:
echo | openssl s_client \
-connect video.ibasterisk.eu:443 \
-servername video.ibasterisk.eu 2>/dev/null \
| openssl x509 -noout -ext subjectAltName
Vo výstupe by sme mali nájsť aj našu subdoménu:
Výstup
X509v3 Subject Alternative Name:
DNS:chat.ibasterisk.eu, DNS:christmas.ibasterisk.eu, DNS:cv.ibasterisk.eu, DNS:halloween.ibasterisk.eu, DNS:ibasterisk.eu, DNS:mail.ibasterisk.eu, DNS:moto.ibasterisk.eu, DNS:music.ibasterisk.eu, DNS:video.ibasterisk.eu
Ak sa medzi hodnotami Subject Alternative Name nachádza DNS:video.ibasterisk.eu, znamená to, že subdoména je správne zahrnutá v SSL certifikáte.
Celý postup v skratke
1. DNS
video.ibasterisk.eu
↓
verejná IP adresa
2. FortiGate / Firewall
TCP 80 a 443
↓
Mailcow Nginx
3. /opt/mailcow-dockerized/mailcow.conf
↓
ADDITIONAL_SAN=...,video.ibasterisk.eu
4. data/conf/nginx/00-custom-apps.conf
↓
pridať video.ibasterisk.eu
↓
nastaviť target_port 3080
5. docker compose up -d
6. docker compose restart acme-mailcow
7. skontrolovať ACME log
8. docker compose restart nginx-mailcow
9. overiť
https://video.ibasterisk.eu