Onion Information
Konfiguracija HTTPS-a u web poslužitelju Apache HTTP Server - GASERI
Modul mod_ssl implementira podršku za SSLv3 i TLSv1.x u Apacheju (SSLv2 više nije podržan jer se smatra nesigurnim) koji se koriste kod ostvarivanja HTTPS veza. Za izvođenje kriptografskih algoritama koristi se OpenSSL
Onion Details
Page Clicks: 0
First Seen: 03/15/2024
Last Indexed: 09/18/2024
Onion Content
Konfiguracija HTTPS-a u web poslužitelju Apache HTTP Server - Modul mod_ssl implementira podršku za SSLv3 i TLSv1.x u Apacheju (SSLv2 više nije podržan jer se smatra nesigurnim) koji se koriste kod ostvarivanja HTTPS veza. Za izvođenje kriptografskih algoritama koristi se OpenSSL . Hint - Više detalja o SSL-u i TLS-u u Apacheju moguće je pronaći u službenoj dokumentaciji u dijelu Apache SSL/TLS Encryption - Stvaranje i postavljanje certifikata i privatnog ključa - Stvorimo samopotpisani certifikat server.crt koji traje 30 dana i njegov pripadni tajni ključ server.key (takva imena datoteka će nam trebati kasnije): Dodajmo dvije nove naredbe COPY u Dockerfile kojima ćemo kopirati certifikat i tajni ključ u direktorij /usr/local/apache2/conf unutar slike: U datoteci my-httpd.conf odkomentirajmo linije: Modul mod_ssl za svoj rad zahtijeva modul mod_socache_shmcb pa prva od tri linije učitava taj modul. Druga linija učitava mod_ssl, a treća njegovu konfiguraciju u kojoj se nalaze naredbe kao što je Listen 443 koja uključuje HTTPS na vratima 443. Konfiguraciju ćemo nešto kasnije uređivati. Izgradimo sliku i pokrenimo kontejner: Ukoliko se kod izdavanja certifikata pod Common Name unese apache-primjer.rm.miletic.net , upozorenja server certificate does NOT include an ID which matches the server name ne bi trebalo biti. Ovo drugo upozorenje, server certificate is a CA certificate (BasicConstraints: CA == TRUE !?) , Apache daje zato što je certifikat samopotpisan. Zbog toga kod testiranja naredba curl treba parametar -k i imamo: Konfiguracijske naredbe HTTPS poslužitelja - Vidimo da HTTPS poslužitelj odgovara na upit, ali ne sadržajem datoteke index.html koji smo se nadali dobiti. Na strani poslužitelja ispisuju se poruke o pogreškama: Morat ćemo konfigurirati DocumentRoot i za HTTPS poslužitelj. Dohvatimo konfiguracijsku datoteku: Todo - Nedostaje kratak opis sadržaja datoteke. Uredimo datoteku; uočimo da u njoj postoji niz konfiguracijskih naredbi koje počinju nizom slova SSL i određuju način rada SSL-a. Naredbom SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES ( dokumentacija ) navode se dozvoljeni šifrarnici. Podsjetimo se da se kod SSL-a koriste četiri vrste šifrarnika: Prve dvije vrste algoritma se u nekim podjelama šifrirarnika navode zajedno pa onda kažemo da su tri različite vrste šifrarnika. U našem slučaju vrijednost HIGH:MEDIUM:!MD5:!RC4:!3DES ima značenje: Note - Za današnje standarde korištenje ovoliko širokog skupa šifrarnika (koji onda uključuje i neke slabe šifrarnike) ne bi bilo preporučeno. Popise preporučenih šifrarnika možete pročitati na Remy van Elstovom blogu u članku Strong SSL Security on Apache2 i na Mozillinom wikiju u članku Security/Server Side TLS . Pored toga, Mozilla je razvila generator konfiguracija SSL-a koji je vrlo jednostavan za korištenje, a podržava i Apache. Naredbom openssl ciphers možemo provjeriti o kojim se točno šifrarnicima radi: Skup algoritama za šifriranje čije korištenje se preporuča kod rada sa TLS/SSL certifikatima mijenja se iz godine u godinu kako se pronalaze sigurnosni propusti u njima i kako procesna moć računala raste pa je dobro kod postavljanja TLS-a/SSL-a provjeriti aktualne najbolje prakse, primjerice one koje navodi Qualys SLL Labs , autor SSL Server Testa i SSL Client Testa . Naredba SSLProtocol all -SSLv3 ( dokumentacija ) definira dozvoljene verzije TLS-a i SSL-a. Vrijednost all -SSLv3 uključuje TLSv1, TLSv1.1, TLSv1.2, TLSv1.3, a isključuje SSLv3. Naredbe SSLCertificateFile "/usr/local/apache2/conf/server.crt" i SSLCertificateKeyFile "/usr/local/apache2/conf/server.key" navode certifikat i pripadni tajni ključ koji se koriste (respektivno). Osim konfiguracijskih naredbi koje počinju nizom slova SSL , unutar bloka vidimo i već poznate naredbe DocumentRoot , ServerName i ServerAdmin : Detaljnije se načinom rada virtualnih domaćina (naredba , dokumentacija ) bavimo drugdje. Postavimo DocumentRoot "/var/www/html" i ServerName apache-primjer.rm.miletic.net:443 , a ServerAdmin na vlastitu e-mail adresu. Dodajmo u Dockerfile kopiranje izmijenjene datoteke na odgovarajuće mjesto: Izgradimo sliku i pokrenimo Docker kontejner: Uvjerimo se da sada radi ispravno: U praksi je ponekad moguće automatizirati čitav ovdje opisani postupak. Naime, Apache od verzije 2.4.30 nadalje sadrži mod_md koji dohvaća certifikate s besplatnog i otvorenog autoriteta certifikata Let's Encrypt za domene navedene pod konfiguracijskom naredbom MDomain . Nažalost, taj postupak ovdje ne možemo koristiti jer Let's Encrypt zahtijeva da imamo registrirane domene na internetu kako bi mogao izdati certifikat za njih. Pored toga, čak i kad možemo automatizirati postavljanje certifikata, dobro je znati kako čitav postupak izgleda kako bismo se mogli snaći u situacijama kad neki dio tog automatiziranog postupka zakaže. Server Name Indication - Ranije prikazani način dohvaćanja domaćina kojeg želimo navođenjem njegovog imena u zaglavlju Host neće raditi kad se koristi HTTPS: Razlog je da više HTTPS poslužitelja na jednoj IP adresi zahtijeva Server Name Indication (kraće SNI, dokumentiran u RFC-u 6066: Transport Layer Security (TLS) Extensions: Extension Definitions u odjeljku 3. Server Name Indication ). Za tu svrhu cURL ima parametre --resolve i --connect-to , od kojih prvi koristimo u nastavku. Konfiguracija virtualnih domaćina za HTTPS - Želimo li virtualne domaćine korisiti u kombinaciji s HTTPS-om, dodat ćemo u my-httpd-vhosts.conf blokove za virtualne domaćine na HTTPS vratima 443: Vidimo da opet imamo zadani blok i onda po jedan blok za svako web sjedište. Ovi blokovi imaju dodatne konfiguracijske naredbe SSLCertificateFile i SSLCertificateKeyFile . Certifikate i privatne ključeve ćemo kao i ranije generirati OpenSSL-om i paziti da pod Common Name navedemo imena domena: Dockerfile ćemo dodati 4 nove naredbe COPY i sada je oblika: Izgradit ćemo sliku i pokrenut Docker kontejner: Sad možemo cURL-om isprobati da virtualni domaćini rade ispravno kad se koristi HTTPS (zbog SNI-ja nije dovoljno koristiti --header Host: ... pa koristimo --resolve ): Mi ovdje cURL-u parametrom --resolve kažemo da preskoči DNS pretragu i zatraži URL-ove https://prometej.rm.miletic.net/ i https://epimetej.rm.miletic.net/ na adresi 172.17.0.2 i vratima 443. Uvjerimo se da ostali zahtjevi završavaju na zadanom virtualnom domaćinu: Author: Vedran Miletić