V tomto článku se naučíme nakonfigurovat web server httpd. Instalace softwarového balíčku se nemusí provádět, protože web server httpd je součástí operačního systému.

K tomu, abychom moohli provozovat web server potřebujeme:

  • veřejnou IP adresu ,to může být problém na IPv4, na IPv6 nikoliv. Budeme používat IPv6.

  • A nebo AAAA záznam v nějaké doméně (my to budeme dělat v doméně jr.lixis.cz a AAAA záznamy jsem vám udělal).

  • stroj, který poběží nepřetržitě (to budou vaše virtuální stroje, které máte hotové).

Nejprve nakonfigurujeme jednoduchý web server pro nešiftovaný protokol http, potom si vystavíme certifikát pro tento web a necháme si ho podepsat certifikační autoritou (protokol acme) a nakonec spustíme plně šifrovaný web, který bude fungovat na protokolu https.

Veškerá data (i programy) , která chceme poskytovat okolnímu světu pomocí http nebo https jsou v adresáři /var/www. Pro process httpd je tento adresář kořenový, to znamená, že httpd nevidí celý systém, ale je uzavřen v tzv. chrootu, v kleci, ze které nemůže vyskočit. To je důležitý bezpečnostní prvek, který zabezpečuje, že i v případě, kdy útočník nějakým způsobem zlomí web, tak se nedostane k celému systému a nemůže ho poškodit.

Je dobré vědět, že na jedné IP adrese se může provozovat více nezávislých webů současně. To je důsledek nedostatku IPv4 adres. U protokolu IPv6 nedostatek vůbec nehrozí a nepoužívá se to.

Po každé změně konfigurace musíme restartovat web server příkazem rcctl restart httpd.

Chyby v konfiguraci můžeme zjistit rcctl configtest httpd.

Konfigurace web serveru

Konfigurace web serveru se nachází v textovém souboru /etc/httpd.conf.

1. Nejjednodušší konfigurace httpd serveru (jenom protokol http):

/etc/httpd.conf
server "obsd46.jr.lixis.cz" {
    listen on * port 80
    root "/htdocs"
}

2. Konfigurace serveru připravená pro získání certifikátu od certifikační autority Let’s Encrypt.

/etc/httpd.conf
server "obsd46.jr.lixis.cz" {
    listen on * port 80
    root "/htdocs"
    location "/.well-known/acme-challenge/*" {
        root "/acme"
        request strip 2
    }
}

3. Konfigurace httpd serveru pro protokoly http i https (máme podepsaný certifikát).

/etc/httpd.conf
server "obsd46.jr.lixis.cz" {
        listen on * port 80
        location "/.well-known/acme-challenge/*" {
                root "/acme"
                request strip 2
        }
        location * {
                block return 302 "https://$HTTP_HOST$REQUEST_URI"
        }
}

server "obsd46.jr.lixis.cz" {
        listen on * tls port 443
        tls {
                certificate "/etc/ssl/obsd46.jr.lixis.cz.fullchain.pem"
                key "/etc/ssl/private/obsd46.jr.lixis.cz.key"
        }
        location "/*" {
                directory auto index
        }
}

V souboru /etc/examples/httpd.conf najdeme funkční příklad, který upravíme podle sebe (změníme jméno webu a cesty k certifikátu a klíči.)

Získání certifikátu

Pro získání certifikátu musíme nakonfigurovat službu acme-client.

/etc/acme-client.conf
authority letsencrypt {
        api url "https://acme-v02.api.letsencrypt.org/directory"
        account key "/etc/acme/letsencrypt-privkey.pem"
}

authority letsencrypt-staging {
        api url "https://acme-staging.api.letsencrypt.org/directory"
        account key "/etc/acme/letsencrypt-staging-privkey.pem"
}

domain obsd46.jr.lixis.cz {                                                         (1)
        domain key "/etc/ssl/private/obsd46.jr.lixis.cz.key"                        (2)
        domain certificate "/etc/ssl/obsd46.jr.lixis.cz.crt"                        (3)
        domain full chain certificate "/etc/ssl/obsd46.jr.lixis.cz.fullchain.pem"   (4)
        sign with letsencrypt
}
1 Jméno našeho webu
2 Kde bude uložen privátní klíč.
3 Kde bude uložen certifikát.
4 Kde bude uložen certifikát včetně řetězce certifikátů podepisujících certifikačních autorit.

Příklad konfiguračního souboru pro acme-client najdete v /etc/examples/acme-client.conf.

Získání certifikátu
obsd46# acme-client -v obsd46.jr.lixis.cz
Problém se získáním certifikátu
obsd46# acme-client -v obsd46.jr.lixis.cz
acme-client: /etc/acme/letsencrypt-privkey.pem: generated RSA account key
acme-client: /etc/ssl/private/obsd46.jr.lixis.cz.key: generated RSA domain key
acme-client: https://acme-v02.api.letsencrypt.org/directory: directories
acme-client: acme-v02.api.letsencrypt.org: DNS: 172.65.32.248
acme-client: acme-v02.api.letsencrypt.org: DNS: 2606:4700:60:0:f53d:5624:85c7:3a2c
account key: https://acme-v02.api.letsencrypt.org/acme/acct/3043331266
acme-client: account key: https://acme-v02.api.letsencrypt.org/acme/acct/3043331266
acme-client: dochngreq: https://acme-v02.api.letsencrypt.org/acme/authz/3043331266/655575836036
acme-client: challenge, token: k7YoUzb7f-54w6Muh65mNtw1kCBBzMr80Nt1jIEOH_E, uri: https://acme-v02.api.letsencrypt.org/acme/chall/3043331266/655575836036/eHfapQ, status: 0
acme-client: /var/www/acme/k7YoUzb7f-54w6Muh65mNtw1kCBBzMr80Nt1jIEOH_E: created
acme-client: https://acme-v02.api.letsencrypt.org/acme/chall/3043331266/655575836036/eHfapQ: challenge
acme-client: order.status 0
acme-client: dochngreq: https://acme-v02.api.letsencrypt.org/acme/authz/3043331266/655575836036
acme-client: challenge, token: k7YoUzb7f-54w6Muh65mNtw1kCBBzMr80Nt1jIEOH_E, uri: https://acme-v02.api.letsencrypt.org/acme/chall/3043331266/655575836036/eHfapQ, status: -1
acme-client: order.status -1
acme-client: dochngreq: https://acme-v02.api.letsencrypt.org/acme/authz/3043331266/655575836036
acme-client: 2a12:b7c0:3:110::fa46: Invalid response from http://obsd46.jr.lixis.cz/.well-known/acme-challenge/k7YoUzb7f-54w6Muh65mNtw1kCBBzMr80Nt1jIEOH_E: 404 (1)
acme-client: bad exit: netproc(11197): 1
obsd46#
1 chybový kód 404 web serveru znamená, že požadovaná web stránka neexistuje.

Problém je v tom, že mi zcela určitě neběží httpd se správnou konfigurací. Musím to napravit a nalézt chybu.

Už to funguje
obsd46# acme-client -v obsd46.jr.lixis.cz
acme-client: https://acme-v02.api.letsencrypt.org/directory: directories
acme-client: acme-v02.api.letsencrypt.org: DNS: 172.65.32.248
acme-client: acme-v02.api.letsencrypt.org: DNS: 2606:4700:60:0:f53d:5624:85c7:3a2c
acme-client: account key: https://acme-v02.api.letsencrypt.org/acme/acct/3043331266
acme-client: dochngreq: https://acme-v02.api.letsencrypt.org/acme/authz/3043331266/655583136196
acme-client: challenge, token: frN_iaOak8whMqX0z1jph9PTukgeTa3BRhTeeGNUvmE, uri: https://acme-v02.api.letsencrypt.org/acme/chall/3043331266/655583136196/8madQg, status: 0
acme-client: /var/www/acme/frN_iaOak8whMqX0z1jph9PTukgeTa3BRhTeeGNUvmE: created
acme-client: https://acme-v02.api.letsencrypt.org/acme/chall/3043331266/655583136196/8madQg: challenge
acme-client: order.status 0
acme-client: dochngreq: https://acme-v02.api.letsencrypt.org/acme/authz/3043331266/655583136196
acme-client: challenge, token: frN_iaOak8whMqX0z1jph9PTukgeTa3BRhTeeGNUvmE, uri: https://acme-v02.api.letsencrypt.org/acme/chall/3043331266/655583136196/8madQg, status: 2
acme-client: order.status 1
acme-client: https://acme-v02.api.letsencrypt.org/acme/finalize/3043331266/478129223796: certificate
acme-client: order.status 3
acme-client: https://acme-v02.api.letsencrypt.org/acme/cert/0695d0aedca74d9b123fd6ad13ad87837995: certificate
acme-client: /etc/ssl/obsd46.jr.lixis.cz.crt: created
acme-client: /etc/ssl/obsd46.jr.lixis.cz.fullchain.pem: created
obsd46#

Chyba v konfiguraci byla ta, že jsem ve slově challenge "/.well-known/acme-challenge/" napsal jedno l (špatně to bylo tak: "/.well-known/acme-chalenge/")

Pokud se vám nebude dařit získat podepsaný certifikát, je chyba vždy ve špatné konfiguraci /etc/httpd.conf anebo /etc/acme-client.conf.

Pokud nechcete psát konfigurační soubory /etc/httpd.conf a /etc/acme-client.conf, tak si zkopírujte příklady z adresáře /etc/examples a upravte si je.

cp /etc/examples/httpd.conf /etc/
cp /etc/examples/acme-client.conf /etc/
mcedit /etc/httpd.conf
mcedit /etc/acme-client.conf

Funkční web server

Potom, co se podařilo získat podepsaný certifikát, upravíme konfiguraci do finální verze:

/etc/httpd.conf
server "obsd46.jr.lixis.cz" {
        listen on * port 80
        location "/.well-known/acme-challenge/*" {
                root "/acme"
                request strip 2
        }
        location * {
                block return 302 "https://$HTTP_HOST$REQUEST_URI" (1)
        }
}

server "obsd46.jr.lixis.cz" {
        listen on * tls port 443
        tls {
                certificate "/etc/ssl/obsd46.jr.lixis.cz.fullchain.pem" (2)
                key         "/etc/ssl/private/obsd46.jr.lixis.cz.key"
        }
        location "/*" {
                directory auto index
        }
}
1 Toto nám umožní automatické přesměrování z http protokolu na https protokol.
2 Je dobré dávat do řádku certificate plný řetěz certifikátů obsd46.jr.lixis.cz.fullchain.pem místo obsd46.jr.lixis.cz.crt. Prohlížečům to usnadňuje vyřešit otázku, kdo certifikát vydal.

S touto jednoduchou konfigurací se dá překvapivě dosáhnout velmi dobrých výsledků (A) při testu zabezpečení serveru u Qualys SSL Labs: https://www.ssllabs.com/ssltest/analyze.html?d=obsd46.jr.lixis.cz

Zdroje a odkazy

Manuálové stránky:
man httpd.conf      (1)
man acme-client     (2)
1 Manuál pro konfigurační soubor web serveru.
2 Manuálová stránka pro acme-client.
Příklady konfiguračních souborů (přímo v systému OpenBSD)
/etc/examples/acme-client.conf
/etc/examples/httpd.conf
Test zabezpečení web serveru (doporučeno)

https://www.ssllabs.com/ssltest/analyze.html?d=obsd46.jr.lixis.cz

Testovátko na správnou konfiguraci certifikačního řetězu (funguje pro IPv4, pro weby s jenom IPv6 adresou nechce fungovat)

https://www.sslshopper.com/ssl-checker.html#hostname=obsd46.jr.lixis.cz