Vodnik po korakih za nastavitev SSL na strežniku Apache

SSL Branje: 8 min

Ta vodnik prikazuje, kako obstoječe potrdilo SSL ročno namestiš na spletni strežnik Apache, na strežniku Linux brez nadzorne plošče, na primer na naših strežnikih KVM VPS. Koraki delujejo v Debianu in Ubuntuju ter v AlmaLinux, Rocky Linux in drugih sistemih na osnovi Red Hat; kjer se razlikujeta, navedemo obe različici.

Ročna nastavitev ni vedno potrebna:

  • Na gostovanju cPanel in spletnem gostovanju potrdilo namesti nadzorna plošča (pri Let’s Encrypt samodejno), nastavitev spletnega strežnika se ti ni treba dotikati.
  • Če želiš na svoj strežnik brezplačno potrdilo Let’s Encrypt, Certbot opravi pridobitev potrdila, nastavitev Apacheja in podaljšanje.

Ročna namestitev je potrebna, če si kupil plačljivo potrdilo ali si potrdilo dobil drugje in moraš datoteke na strežnik postaviti sam. O vrsti potrdila, pripravi CSR in namestitvi v cPanel na splošno govori naš blogovski zapis o namestitvi potrdila SSL.

Kaj potrebuješ

  • Pravice root ali sudo na strežniku.
  • Apache že deluje, domena pa je dosegljiva prek HTTP (zapis A domene kaže na naslov IP strežnika). Če še ni nameščen, glej: Namestitev Apacheja in PHP-FPM v AlmaLinux 9.
  • Vrata 443 so odprta v požarnem zidu (glej: Kako nastavim požarni zid na svojem VPS?).
  • Tri datoteke v obliki PEM (besedilni):
    • potrdilo domene (na primer pelda.hu.crt), ki si ga dobil od izdajatelja;
    • vmesno potrdilo ali CA bundle (na primer ca-bundle.crt), ki pride s potrdilom;
    • zasebni ključ (na primer pelda.hu.key), ki je nastal skupaj s CSR. Tega izdajatelj ne pošlje, ker ga nikoli ni dobil: je tam, kjer si ustvaril CSR (glej: Ustvarjanje CSR in zasebnega ključa).

Če si potrdilo dobil v obliki PFX ali P7B, ga najprej pretvori v PEM po članku o oblikah potrdil. Datoteka PEM se, odprta v urejevalniku besedil, začne z vrstico -----BEGIN CERTIFICATE----- (pri ključu -----BEGIN PRIVATE KEY-----).

V primerih je domena pelda.hu; ukaze in nastavitve prepiši na svojo domeno.

1. Vklop modula SSL

Debian, Ubuntu: modul SSL (mod_ssl) je del paketa apache2, ločeno ga ni treba nameščati, le vklopiti ga je treba:

sudo a2enmod ssl

AlmaLinux, Rocky Linux, CloudLinux: modul je v ločenem paketu:

sudo dnf install -y mod_ssl

Paket ustvari datoteko /etc/httpd/conf.d/ssl.conf s privzetim navideznim gostiteljem HTTPS, ki uporablja samopodpisano potrdilo, ki ga brskalniki ne sprejmejo. To datoteko pusti (v njej so tudi splošne nastavitve modula), za svojo domeno pa v 3. koraku ustvariš ločeno datoteko.

2. Postavitev datotek

Potrdilo domene in vmesno potrdilo združi v eno datoteko. Vrstni red je pomemben: najprej potrdilo domene, za njim vmesno:

cat pelda.hu.crt ca-bundle.crt > pelda.hu-fullchain.crt

Nato datoteke prekopiraj na običajno mesto v sistemu in nastavi dovoljenja. Zasebni ključ lahko bere le root; Apache ključ prebere ob zagonu, še s pravicami root.

Debian, Ubuntu:

sudo cp pelda.hu-fullchain.crt /etc/ssl/certs/
sudo cp pelda.hu.key /etc/ssl/private/
sudo chown root:root /etc/ssl/private/pelda.hu.key
sudo chmod 600 /etc/ssl/private/pelda.hu.key

AlmaLinux, Rocky Linux, CloudLinux:

sudo cp pelda.hu-fullchain.crt /etc/pki/tls/certs/
sudo cp pelda.hu.key /etc/pki/tls/private/
sudo chown root:root /etc/pki/tls/private/pelda.hu.key
sudo chmod 600 /etc/pki/tls/private/pelda.hu.key
sudo restorecon -Rv /etc/pki/tls

Zadnji ukaz obnovi oznako SELinux datotek. Če datoteke namesto s cp premakneš z ukazom mv (na primer iz svojega imenika), ohranijo staro oznako in jih Apache zaradi SELinuxa ne more odpreti, tudi če so dovoljenja v redu.

Zasebnega ključa ne postavljaj v imenik spletne strani (na primer pod /var/www) in ga ne pošiljaj po e-pošti. Če je vseeno prišel v napačne roke, korake opisuje članek o razkritem zasebnem ključu.

3. Nastavitev navideznega gostitelja HTTPS

Za domeno ustvari novo konfiguracijsko datoteko.

Debian, Ubuntu: /etc/apache2/sites-available/pelda.hu-ssl.conf

AlmaLinux, Rocky Linux, CloudLinux: /etc/httpd/conf.d/pelda.hu-ssl.conf

Vsebina (poti datotek navedi glede na svoj sistem):

<VirtualHost *:443>
    ServerName pelda.hu
    ServerAlias www.pelda.hu
    DocumentRoot /var/www/pelda.hu

    SSLEngine on
    SSLCertificateFile    /etc/ssl/certs/pelda.hu-fullchain.crt
    SSLCertificateKeyFile /etc/ssl/private/pelda.hu.key

    ErrorLog  /var/log/apache2/pelda.hu-ssl-error.log
    CustomLog /var/log/apache2/pelda.hu-ssl-access.log combined
</VirtualHost>

V sistemu na osnovi Red Hat je pot potrdila /etc/pki/tls/certs/pelda.hu-fullchain.crt, pot ključa /etc/pki/tls/private/pelda.hu.key, dnevniki pa /var/log/httpd/....

DocumentRoot naj bo enak kot v navideznem gostitelju HTTP (vrata 80), in če so tam še druge nastavitve (blok <Directory>, upravljalnik PHP-FPM), jih prekopiraj tudi sem, sicer spletna stran prek HTTPS deluje drugače.

V starih opisih je še tretja vrstica, SSLCertificateChainFile, s katero je bilo mogoče vmesno potrdilo navesti v ločeni datoteki. Apache jo od različice 2.4.8 šteje za zastarelo; danes vse podprte distribucije Linux ponujajo novejši Apache, zato zadošča, da je vmesno potrdilo v datoteki SSLCertificateFile, za potrdilom domene. Zakaj stran na nekaterih napravah ne deluje, če vmesno potrdilo manjka, razloži članek o vmesnem potrdilu.

Debian, Ubuntu: vklopi novo stran:

sudo a2ensite pelda.hu-ssl

V sistemu na osnovi Red Hat Apache datoteke .conf v imeniku conf.d naloži sam.

Le varni protokoli

SSL 3.0, TLS 1.0 in TLS 1.1 so zastareli in ranljivi (glej: Kakšna je razlika med TLS in SSL?). Osnovna nastavitev današnjih distribucij jih večinoma že ne dovoli, vendar je dobro izrecno dovoliti le TLS 1.2 in TLS 1.3. V Debianu in Ubuntuju v datoteki /etc/apache2/mods-available/ssl.conf, v sistemu na osnovi Red Hat pa v datoteki /etc/httpd/conf.d/ssl.conf poišči vrstico SSLProtocol (če je zakomentirana z znakom #, znak izbriši, če take vrstice ni, jo dodaj) in jo prepiši takole:

SSLProtocol -all +TLSv1.2 +TLSv1.3

V AlmaLinux in Rocky Linux nastavitve šifriranja ureja tudi sistemski kriptografski pravilnik (update-crypto-policies), katerega raven DEFAULT dovoljuje le še TLS 1.2 in novejše. Za podrobno nastavitev šifrirnih algoritmov ti Mozillino orodje SSL Configuration Generator da sodoben vzorec, prilagojen tvoji različici Apacheja in OpenSSL.

4. Preverjanje in ponovni zagon

Preden Apache znova naložiš, preveri sintakso nastavitev:

sudo apachectl configtest

Če je odgovor Syntax OK, znova naloži spletni strežnik:

sudo systemctl reload apache2   # Debian, Ubuntu
sudo systemctl reload httpd     # AlmaLinux, Rocky Linux, CloudLinux

Ob prvem vklopu modula je namesto reload potreben restart. Če se Apache ne zažene, vzrok napake pokaže ukaz sudo journalctl -u apache2 -n 50 (v sistemu na osnovi Red Hat -u httpd) oziroma dnevnik napak.

5. Preusmeritev s HTTP na HTTPS

Po namestitvi potrdila je spletna stran dosegljiva tudi prek HTTPS, a naslov http:// deluje še naprej. Obiskovalce in iskalnike lahko v navideznem gostitelju na vratih 80 s trajno preusmeritvijo (301) usmeriš na HTTPS. Vsebino navideznega gostitelja HTTP zamenjaj s tem:

<VirtualHost *:80>
    ServerName pelda.hu
    ServerAlias www.pelda.hu
    Redirect permanent / https://pelda.hu/
</VirtualHost>

Če bi preusmeritev raje uredil v datoteki .htaccess ali te zanimajo koraki, ki sledijo prehodu (notranje povezave, mešana vsebina, Google Search Console), glej: Kako lahko svojo spletno stran preusmerim na HTTPS?. Ko vse dobro deluje, lahko z glavo HSTS brskalnikom tudi naročiš, naj stran že vnaprej odpirajo le prek HTTPS.

6. Preverjanje namestitve

Odpri stran v brskalniku z naslovom https:// in poglej, ali v naslovni vrstici ni opozorila. To pa samo po sebi ni dovolj: brskalniki manjkajoče vmesno potrdilo pogosto dopolnijo sami, drugi programi in starejši telefoni pa ne.

Zanesljivejše je naše brezplačno orodje za preverjanje SSL: pokaže, ali je potrdilo veljavno, za katera imena velja, kdaj poteče in ali je veriga potrdil popolna. Hkrati vnesi naslova pelda.hu, www.pelda.hu, tako v enem koraku preveriš obe različici.

Iz ukazne vrstice z OpenSSL pogledaš, kakšno verigo potrdil pošilja strežnik:

openssl s_client -connect pelda.hu:443 -servername pelda.hu -showcerts </dev/null

Na začetku izpisa morata biti pod Certificate chain navedeni vsaj dve potrdili (domene in vmesno), na koncu pa vrstica Verify return code: 0 (ok).

Pogoste napake

Apache se ne zažene, v dnevniku je napaka AH02565 ali „key values mismatch”. Potrdilo in zasebni ključ ne spadata skupaj, na primer ker je bilo potrdilo zahtevano z drugim, pozneje narejenim CSR. Ali spadata skupaj, preveriš s primerjavo njunih javnih ključev; ukaza morata izpisati isto vrednost:

openssl x509 -in pelda.hu-fullchain.crt -noout -pubkey | openssl sha256
openssl pkey -in pelda.hu.key -pubout | openssl sha256

Če se razlikujeta, poišči ključ, ki pripada potrdilu, ali naredi nov ključ in CSR ter daj potrdilo znova izdati. Pri potrdilu, kupljenem pri aWh, to narediš na portalu za stranke (glej: Nastavitev in ponovna izdaja plačljivega potrdila SSL).

Apache ob zagonu zahteva geslo ali ga ukaz systemctl ne more zagnati. Zasebni ključ je zaščiten z geslom. Na strežniku ključ običajno hranijo brez gesla (zaščito mu dajejo dovoljenja 600), geslo odstraniš takole:

sudo openssl pkey -in pelda.hu.key -out pelda.hu-nopass.key
sudo chmod 600 pelda.hu-nopass.key

Ukaz zahteva geslo ključa in ga brez gesla zapiše v novo datoteko. Nato v vrstici SSLCertificateKeyFile navedi to datoteko, staro pa izbriši.

Stran na nekaterih napravah, v programih ali na telefonih vrne napako potrdila, v brskalniku pa je v redu. Manjka vmesno potrdilo: preveri, ali je v datoteki, ki jo določa SSLCertificateFile, za potrdilom domene tudi vmesno.

Brskalnik potrdila ne vidi kot izdanega za domeno ali kaže samopodpisano potrdilo. Apache za zahtevo uporablja drug navidezni gostitelj. Preveri, ali se ServerName in ServerAlias natančno ujemata z odprtim naslovom (vključno z različico www), in z ukazom sudo apachectl -S poglej, kateri navidezni gostitelji so v kateri datoteki na vratih 443. Pomen sporočil o napakah brskalnikov navaja članek o napaki „Vaša povezava ni zasebna”.

apachectl configtest vrne napako „Invalid command ‘SSLEngine’”. Modul SSL ni vklopljen ali nameščen: zaženi ukaz iz 1. koraka.

Prek HTTPS se brskalnik ne more povezati (iztek časa ali „povezava zavrnjena”), prek HTTP pa stran deluje. Požarni zid ne dovoli vrat 443. V AlmaLinux in Rocky Linux mora biti v izpisu sudo firewall-cmd --list-services storitev https, v Ubuntuju pri uporabi požarnega zidu ufw odprta vrata pokaže ukaz sudo ufw status.

Podaljšanje potrdila

Plačljiva potrdila veljajo največ 200 dni, zato je treba potrdilo med enoletno naročnino vsaj enkrat znova izdati (glej: Zakaj potrdila SSL ne veljajo več eno leto?). Takrat po 2. koraku zamenjaj datoteko potrdila in znova naloži Apache; nastavitev navideznega gostitelja ti ni treba spreminjati, če obdržiš ime datoteke. Če si naredil tudi nov zasebni ključ, zamenjaj tudi tega.

Ročno zamenjavo lahko nadomestiš, če uporabljaš plačljivo potrdilo z naročnino ACME: tega Certbot podaljšuje samodejno enako kot potrdila Let’s Encrypt (glej konec članka o Certbotu). Datum poteka lahko spremljaš po članku o preverjanju poteka potrdila.

Če se med nastavitvijo zatakne, nam piši z imenom domene in sporočilom o napaki.

Nazaj: SSL – članki (35)