HTTPS, TLS: self-signed certificate for SDS

HTTPS, TLS

SDS moduly řady 512 poskytují, je-li instalován aktuální firmware, komunikaci zabezpečeným šifrovaným protokolem TLS - což umožňuje provozovat HTTPS.

Tato stránka popisuje, jak vytvořit svůj dočasný, vývojový / testovací, self-signed certifikát - a tím si rychle zprovozni TLS v rámci SDS.

Pro produkční nasazení ale použijte finální certifikát a klíč, získaný z vašeho produkčního PKI stromu !

Vždy si hlídejte expirační datum instalovaného certifikátu. Po překročení expirace certifikátu nebude TLS fungovat (toto je jeden z nejčastějších problémů. tak jednoduchý a přesto obvykle nejvíce potrápí).


K čemu je serverový certifikát (a klíč)

Aby bylo možné navázat TLS spojení, tedy aby klient (prohlížeč na PC) se mohl připojit k serveru (webový server v SDS), musí být klient schopen ověřit, že se skutečně baví s uživatelem požadovaným serverem.

Pozn. pro úplnou bezpečnost by si toto ověření musel provést i server (ověřit si klienta), ale toto se zde neprovádí (pro aplikaci "webový server" se nepoužívá Mutual Auth - zde se tím tedy nebudeme zabývat).

Klient si server nejenom ověří, ale současně s ním naváže šifrované spojení. Aby se mu to povedlo, musí proběhnout složitá kryptografická výměna, do které vstupuje právě certifikát od serveru (jeho veřejný klíč, který je v tomto certifikátu schovaný). Je proto zřejmé, že bez (platného) certifikátu, nebude TLS spojení, a tím pádem ani HTTPS.

Aby to celé fungovalo, musí mít server, od nás, nainstalován (nahrán) svůj certifikát a klíč. Klíč je vždy ve formě tzv. páru, tedy veřejná část a soukromá (privátní) část. Je zcela kritické, aby se privátní klíč neprozradil, v ten okamžik by došlo k úplné kompromitaci a ztrátě bezpečnosti. Typicky je pak potřeba certifikát ihned zahodit, zneplatnit, a vytvořit nový.

Každý certifikát má navíc omezenou dobu platnosti. Vždy je určeno od kdy (datum) a do kdy (datum) je platný. Pokud jej kdokoliv použije mimo tento rozsah, bude tento certifikát automaticky odmítnut, a TLS spojení nebude navázáno.

Každý certifikát má také tzv. cílové jméno, přesněji SAN (Subject Alternative Name). V praxi je to složitější, ale pro tento úvod to ponecháme jednoduché. Princip je v tom, že certifikát lze vystavit jen na jedinou doménu (a její drobné, výslovně v certifikátu uvedené, alternativy). Pokud by někdo certifikát "ukradl" a chtěj jej použít pro jinou doménu nebo adresu, tak to bude odmítnuto, a TLS spojení nebude navázáno. Více viz RFC5280 (4.2.1.6).

Dva nejvíce typické problémy, které nejvíce správce certifikátů potrápí, jsou právě chyby v době platnosti (resp. expirované certifikáty, kde si toho "nikdo nevšimnul" a včas je nevyměnil), a také v chybně zadaném názvu (SAN).


Jak si vytvořit certifikát pro IP adresu

Modelový příklad: chcete provozovat SDS na IP adresu 192.168.1.250 a chcete mít aktivní HTTPS pro tuto IP adresu.

Pozor - pokud přistoupíte k SDS přes gateway (přes router, z Internetu), kdy dojde k překladu adres atd., tak nezapomeňte že certifikát má vždy stále stejnou, nezměněnou hodnotu SAN - a ta v takový okamžik už nemusí odpovídat ! Toto se řeší tak, že se nepoužije přímo surová hodnota IP adresy do SAN, ale použije se doménové jméno (např.: abcdefgh.cz) a pak to vždy bude sedět. Jen pak už na SDS nesmíte přistupovat přes IP adresu, ale vždy jen přes doménu. Což vyžaduje, pro lokální vývoj a přístup, zápis do "hosts" nebo do lokálního DNS serveru.

Zpátky k příkladu. Chceme vytvořit certifikát a klíče pro server, pro SDS které je na IP adrese 192.168.1.250, a výsledek do SDS nahrát. Pokud se vše povede, začne SDS poskytovat TLS (HTTPS).

Nejprve je potřeba nainstalovat si OpenSSL. Uživatelé Linuxu to už obvykle mají v rámci systému, uživatelé Windows si to musejí stáhnout (potřebujete binární aplikaci, ne zdrojové kódy) - návod např. zde: https://tecadmin.net/install-openssl-on-windows/ (stahování aplikací z webu je vaše vlastní riziko, vždy se přesvědčte, že je stránka bezpečná, aplikace že není podvrh, a prověřte ji antivirem a antimalware scannerem - a ani tak si nemůžete dnes být jisti).

Jakmile máte openssl nainstalováno, tak se můžete pustit do vytvoření všech souborů, které potřebujeme.

Připravíme si konfigurační soubor - zde uvedený obsah uložte do souboru "sds.cfg" (bez uvozovek). Nejprve jej použijte tak jak je, pak si můžete zkusit jej měnit a doplňovat atd.

[req]
default_bits  = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = XX
stateOrProvinceName = N/A
localityName = N/A
organizationName = SDS
commonName = 192.168.1.250: SDS
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.250

Všimněte si, že jsme vyplnili "commonName" a "subjectAltName" (odkazem na položky v poli "alt_names"). Zde tedy dáváme jako SAN jednu IP adresu, a to 192.168.1.250 dle našeho příkladu. Samozřejmě zde pak nemusí být nutně IP adresa, ale jen doménové jméno atd. - to už si nastudujete a vyzkoušíte sami.

Následně se v příkazovém řádku spustí tento příkaz:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -config sds.cfg

Parametr "-days 365" určuje dobu platnosti certifikátu (tento tedy expiruje za rok). Nedávejte sem moc delší dobu, když je expirace moc vzdálená, řada klientů certifikát záměrně odmítne, pozor na to. Cílem je nutit správce k tomu certifikáty pravidelně obměňovat (to vás čeká v každém případě, a je to u všech serverů s TLS, ne jenom u SDS... ).

Pokud to proběhne správně, vzniknou dva soubory

  • cert.pem
  • cert.key

Můžeme si zkontrolovat, že cert.pem je platný, pomocí jiného příkazu openssl:

openssl x509 -in cert.pem -text -noout

A výstup bude například takovýto:

Certificate:
   Data:
       Version: 3 (0x2)
       Serial Number:
           26:c1:d4:b5:ed:e8:8d:2f:20:7c:80:c1:80:ac:b4:27:a5:16:fe:66
       Signature Algorithm: sha256WithRSAEncryption
       Issuer: C = XX, ST = N/A, L = N/A, O = SDS, CN = 192.168.1.250: SDS
       Validity
           Not Before: Jun 12 12:10:32 2023 GMT
           Not After : Jun 11 12:10:32 2025 GMT
       Subject: C = XX, ST = N/A, L = N/A, O = SDS, CN = 192.168.1.250: SDS
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
               Public-Key: (2048 bit)
               Modulus:
                   00:b4:aa:f1:18:ac:44:ad:0d:7f:ec:fa:f5:2a:d7:
                   24:3e:64:8f:96:fb:b2:c1:2d:55:f2:66:0a:fb:8a:
                   51:ad:f4:ab:d4:d1:d6:08:77:c8:cb:a1:98:c2:cf:
                   06:01:da:76:16:8f:aa:df:f9:d8:01:15:5b:c1:80:
                   01:64:03:32:d5:34:26:11:c9:be:2f:47:54:ad:89:
                   f1:e8:b9:30:2e:4f:a2:82:db:46:57:8c:11:6b:b8:
                   ae:4c:db:de:ee:52:db:83:83:e8:45:a7:97:91:49:
                   b4:72:08:8e:fd:94:ed:6f:4d:c5:0a:cf:5f:bd:ea:
                   b4:48:23:f4:9c:77:4f:f4:8b:0b:cc:79:85:f4:f0:
                   e0:93:62:22:35:98:0f:3d:14:1a:f8:15:5f:c9:0b:
                   8d:e5:dc:5f:7a:e7:13:9d:c4:c2:88:7a:2c:ab:67:
                   cb:be:28:9b:6b:c9:35:51:b3:b0:c3:0b:47:71:1f:
                   70:22:aa:68:e0:f7:e5:93:31:cd:ba:e6:dc:b0:89:
                   d5:b4:1d:4f:b1:2f:65:0d:d8:04:86:b6:c6:77:fe:
                   82:ad:ac:27:f3:e0:7a:e9:43:22:92:5d:0d:26:b0:
                   71:69:87:93:56:49:67:fa:96:d5:b0:5b:d0:ff:d8:
                   82:d3:a0:69:a5:9a:07:4d:23:40:12:74:d4:10:49:
                   27:3f
               Exponent: 65537 (0x10001)
       X509v3 extensions:
           X509v3 Subject Alternative Name:
               IP Address:192.168.1.250
           X509v3 Subject Key Identifier:
               44:5C:34:FC:98:B6:D4:25:59:7C:32:43:FB:F0:70:3D:3E:72:C8:44
   Signature Algorithm: sha256WithRSAEncryption
   Signature Value:
       40:f5:d2:30:a8:fe:e2:71:a1:cc:61:9c:22:42:8a:82:4e:4b:
       87:47:f1:9f:06:24:cf:93:4d:1e:55:16:44:a0:4d:93:13:32:
       54:f6:e0:7f:2a:c0:c4:ab:a8:ce:af:18:7a:0c:8a:5f:86:a1:
       bc:42:cd:4f:b5:56:17:ba:a9:91:b5:5b:3a:92:e5:d9:ca:94:
       1a:c9:45:fd:7d:12:5a:8e:4d:ff:a8:e7:30:e8:05:c8:cc:25:
       e8:42:41:68:32:7b:fc:ec:f2:19:f3:40:7b:13:52:2a:bc:46:
       3e:85:06:e4:03:67:c2:97:07:6e:be:d2:3e:d0:a9:b0:32:5e:
       a9:28:25:69:7a:e2:81:0a:10:7a:65:fd:28:fc:4d:c9:11:35:
       a6:b7:ae:4d:fc:79:ae:b1:94:b1:0f:ac:3b:50:ab:79:46:4a:
       b9:f3:84:72:6a:89:4f:74:5d:1f:e8:23:d5:b2:d3:52:57:4b:
       cd:c4:43:b0:9e:13:d8:fb:79:42:7f:c0:5b:de:2a:42:0f:f3:
       c9:a0:9a:b9:1a:9a:e9:a7:3e:9a:17:80:ec:e5:7a:12:fe:7f:
       f1:b5:24:e3:15:a9:42:d1:5e:f8:af:24:09:db:6f:5e:f6:dd:
       e7:d0:fa:d9:f1:ea:8d:52:72:c8:23:11:34:17:97:40:2b:c9:
       92:9f:88:82


Jak lze vidět, soubor cert.pem tedy skutečně obsahuje veřejný klíč (veřejnou část klíčového páru), viz výpis pro "Public-Key" výše.). Také zde vidíte obsah "X509v3 Subject Alternative Name" viz sds.cfg soubor.

Privátní část klíčového páru je pak celá v souboru "cert.key", který se pouze a jenom nahrává do SDS a nikam jinam ! Prozrazení privátního klíče zcela odstraní bezpečnost, kterou nám TLS přináší (u těchto pokusných certifikátů je to méně podstatné, ale u produkčního nasazení je to zcela kritické).


Nahrání souborů do SDS

Ve webové administraci SDS vlezte do nastavení TLS ("Admin Config" - " CONFIGURE: TLS + CERTs"), kde je dole na stránce prostor s dvěma textovými okny. Do těch je potřeba vložit obsah jednotlivých souborů (do prvního se dá cert.pem, do druhého se dá cert.key). A zadat heslo do SDS, samozřejmě. Pokud to spletete, nepovede se vám to do SDS poslat.

Po nahrání souborů do SDS je zobrazeno hlášení (message box), že se to povedlo a že dojde k automatickému restartu SDS. Pokud se to nepovede, jste o tom také informování hlášením na stránce.

Pokud se vše povedlo, SDS se samo restartuje, a lze na něj přistoupit přes HTTPS - pro náš příklad jako: https://192.168.1.250

Jsou-li certifikát a klíč správně nahrány, SDS ukazuje informaci že TLS je OK a ukazuje veřejný obsah certifikátu a dobu jeho platnosti.

Teď bude vhodné v SDS zakázat protokol HTTP a donutit SDS pracovat jen s HTTPS. To se provede na jiné stránce ve webové administraci SDS ("Admin Config" - "CONFIGURE: MAC, STATIC IP / DHCP, IP-ACCESS FILTER"), kde aktivujete volbu "Disable HTTP - allow HTTPS-only (if TLS is running)" (a zmáčknete tlačítko "Store").


Problémy s prohlížeči při použití self-signed certifikátu

I když vše provedete správně, tak prohlížeče vám stále budou vydávat bezpečnostní varování, dokud budete používat tento "zjednodušený" typ certifikátu.

  • Firefox - vydává hlášku typu " MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT " , kterou musíte odkliknout "Beru na vědomí a chci pokračovat"
  • Chrome - vydává hlášku typu " NET::ERR_CERT_AUTHORITY_INVALID " , kterou musíte odkliknout : "Advanced" - "Continue to 192.168.1.250"

Kromě této doplňující bezpečnostní hlášky pro uživatele, však dojde k plnému otevření TLS tunelu, což se dá následně (i v prohlížeči) ověřit. Lze se také podívat na síťový provoz např, přes Wireshark, a potvrdit si, že skutečně probíhá TLS (HTTPS) komunikace.

Řešením je použití certifikátu od certifikační autority, která je současně zavedena u klienta v seznamu důvěryhodných kořenových certifikačních autoritách.


Pokud použijete certifikát pro jinou adresu či doménu

Klient vám to patřičně oznámí, např. Chrome vydá chybou hlášku " NET::ERR_CERT_COMMON_NAME_INVALID ". Řešením je použít správně vytvořený certifikát, který má v sobě odpovídající údaje (viz konfigurační soubor uvedený výše).