Let’s Encrypt HTTPS Reverse Proxy

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.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük