FIGYELEM a reverse proxy leírás nem teljes, további HTTP’s header-ek szükségesek lehetnek. A példakódok saját felhasználásra készültek.
Alapkérdés
Hogyan tegyünk egy több domaint kiszolgáló wordpress elé úgy tanúsítványt, hogy az összes kezelt domaint lekezelje (ingyen).
Példánkban a már jól ismert alma.hu és korte.hu domain-t forwardoljuk a mesebeli 10.10.10.10-es, a nyílt interneten elérhető IP fele. A valósággal fellelhető bárminemű hasonlóság csak a véletlen műve.
A szerver nek problémát fog okozni a csomag továbbítása, mivel a DNS a reverse proxy címére mutat. Ahhoz, hogy a szerver tudja ki a cél, a host fájlban ezt meg kell adnunk:
10.10.10.10 alma.hu
10.10.10.10 korte.hu
Eddig nem bonyolult, csak ne felejtsünk el tabulátort használni.
Létre kell hoznunk a reverse proxy konfigban minden domain-hez 1 darab document-root-ot, mivel szükséges a certbot-hoz.
mkdir -p /var/www/gyumolcsoskert/alma.hu/.well-known
mkdir -p /var/www/gyumolcsoskert/korte.hu/.well-known
Igazából a .well-known könyvtár kell nekünk.
Az NGINX konfigot 1-1 új domainhoz csak két részletben lehet felvenni. Ezt úgy oldottam meg, hogy 1 darab 80-as konfig fájl van ami minden DNS névhez tartalmazza a titkosítás nélküli konfigurációt, plusz annyi HTTPS konfigurációs fájl, ahány domain-t rögzítünk. A 80-as port konfig egyben gondoskodik a valós szerver biztonságos HTTPS eléréséről is.
HTTP konfiguráció
server {
listen 80;
server_name alma.hu;
location /.well-known {
alias /var/www/gyumolcsoskert/alma.hu/.well-known;
}
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 80;
server_name korte.hu;
location /.well-known {
alias /var/www/gyumolcsoskert/korte.hu/.well-known;
}
location / {
return 301 https://$server_name$request_uri;
}
}
Feledékeny vagyok, és a legjobb, ha a projekt önmagát dokumentálja, ennek megfelelő írtam egy certbot frontend-et, ami megfrissíti a tanúsítványokat. (quick&dirthy)
Egy kis Bash gyakorlás
#!/bin/bash
domainek=('alma.hu' 'korte.hu')
if [[ $1 == "" ]]; then
echo "pls type specific domain or type "all" to update cert to all domain"
exit 0
fi
if [[ $1 == "all" ]];
then
for domainupdate in "${domainek[@]}"
do
echo "ssl update $domainupdate"
certbot certonly -d $domainupdate --webroot -w /var/www/gyumolcsoskert/$domainupdate
done
else
for domaincheck in "${domainek[@]}"
do
if [[ $1 == $domaincheck ]]; then
echo "managed domain, generating certificate"
certbot certonly -d $domaincheck --webroot -w /var/www/gyumolcsoskert/$domaincheck
break
else
echo "Not managed domain"
fi
done
echo "restart reverse proxy"
systemctl restart nginx
fi
Ha a 80-as konfiguráció megvan és a certbot legenerálta a tanúsítványt, jöhet a https konfig, ami domain-enként így néz ki:
HTTPS dedikált konfiguráció /domain
server {
listen 443 ssl;
server_name korte.hu;
ssl_certificate /etc/letsencrypt/live/korte.hu/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/korte.hu/privkey.pem; # managed by Certbot
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
client_max_body_size 50M;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
ssl_prefer_server_ciphers on;
ssl_dhparam dh2048.pem;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass https://korte.hu;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
}
A HTTPS konfigurációs ellenőrizzük SSLlabs-on.