Lekce 19 - Derby DB - Bezpečnost - Šifrovaná komunikace SSL/TLS
V minulé lekci, Derby DB - Bezpečnost - Zašifrování databáze, jsme se věnovali šifrování databáze.
V této a následujících lekcích si předvedeme zabezpečení
šifrovaného spojení. DerbyDB podporuje při spojení šifrovanou komunikaci
SSL/TLS. Ve výchozím stavu je komunikace nešifrovaná a tudíž i snadno
odposlouchatelná (např. přes nějaký sniffer), myšleno pro lidi, co ví,
jak odchytávat packety. Nicméně upozorňuji, že pokud během komunikace
dochází k přenosu většího množství informací (objekt
ResultSet
má v sobě tabulku např. 10MB, 100MB, či GB), pak
odposlech takové tabulky není zas tak jednoduchou záležitostí, přestože
např. řetězce by měly být přímo v plaintextu. To samozřejmě platí,
pokud data chodí přes síť, kterou nemáte pod kontrolou nebo přes veřejnou
sít (tzv. public network), jakou je například internet (WAN). Pokud by
komunikace probíhala na vaší LAN na vlastním HW ve vaší serverovně
(např. mezi nějakým aplikačním serverem a DerbyDB = důvěryhodná sít),
pak šifrovaná komunikace není zas tak nutná. Nezapomeňte, že
šifrování/dešifrování spotřebovává zdroje systému, což na
databázových serverech může mít vliv na výkon.
Existují tedy 3 možnosti nastavení:
- off - Výchozí nastavení, žádné SSL/TLS šifrování
- basic - SSL/TLS šifrování - Klíčový pár (keypairs) je pouze na straně serveru
- peerAuthentication - SSL/TLS šifrování - Tzv. uzlové ověřování (šifrování). Klíčové úložiště je na straně serveru i klienta. Klíčová úložiště musí obsahovat klíčový pár daného uzlu a veřejnou část klíčového páru uzlu druhého, jinak k úspěšné authentifikaci (ověření) nedojde. Pokud chceme k databázi přistupovat např. z 5 klientů, pak serverové uložiště bude mít celkem 1 klíčový pár + 5 veřejných klíčů (klientů), ale každé klientské uložiště bude obsahovat pouze 1 klíčový pár klienta + 1 veřejnou část serverového páru. Tedy za předpokladu, že každý klient bude mít osobní klíčový pár.
Příprava nástrojů
Jako první krok si vygenerujeme serverový klíčový pár, tzv. keypairs (veřejný + soukromý klíč, tzv. public + private keys) a také klíčové úložiště. Klíčové úložiště bude typu JKS (tzv. Java KeyStore), které podporuje standard X.509. Více viz. Keytool parametry příkazu. Klíčové úložiště je prakticky pouze datový soubor, do kterého lze uložit certifikáty nebo klíčové páry.
keytool -genkeypair -alias Server -keyalg EC -keysize 571 -validity 730 -keystore ulozisteS.jks

Nyní si rozepíšeme, co jsme vlastně stvořili. Klíčové úložiště
(keystore) se jmenuje ulozisteS.jks
, jméno (alias) klíčového
páru je Server, klíčový algoritmus je EC,
což znamená "SHA256withECDSA". Délka veřejného klíče je 571 byte.
Validity specifikuje dobu trvání klíče, v našem případě 730 dní = cca 2
roky. Doporučuji mít jiné heslo pro klíčové úložiště (keystore) a
jiné pro klíčový pár (keys pair).
Nyní si provedeme výpis klíčového páru (keypairs) v našem klíčovém úložišti. Protože jsme vyrobili jen jeden, tak se nám vypíše pouze tento:
keytool -list -v -keystore ulozisteS.jks

Jak vidíte z výpisu klíčového úložiště, úložiště je typu JKS. Délka klíče je 570 bitová, standard x.509 je verze 3 a šifra je "SHA256withECDSA". Dole ve výpisu vidíte i upozornění (Warning) o doporučení migrace na jiný formát úložiště. Pokud bychom JKS úložiště chtěli využít, pak se nám server nespustí v této verzi Javy (v Java 7, 6 to fungovalo). Proto je nutná konverze do úložiště typu PKCS12. Úložiště PKCS12 má stejné heslo pro klíčový pár i uložiště, tzn. nepodporuje odlišná hesla.
-importkeystore -srckeystore ulozisteS.jks -destkeystore ulozisteNS.jks -deststoretype pkcs12 -destkeypass asdasd

Po konverzi jsme provedli výpis a jak vidíte, uložiště je typu PKCS12.
Spuštění serveru
Jako první krok provedeme nakopírování klíčovového úložiště
PKCS12 - ulozisteNS.jks
(nebo i druhého JKS -
ulozisteS.jks
) do adresáře naší DerbyDB (např.
\JavaJDK08\bin\db\bin\
). Samozřejmě můžete ji nechant např. na
D:\
nebo někde jinde, ale protože budeme spouštět DerbyDB přes
příkazový řádek, bude nutné cestu k úložišti nastavit v příkazu
spuštění.
Jako druhý krok je nutné spustit skript, který nám nahraje do paměti
(CLASSPATH
) nutné knihovny (external jars), které náš server
využije. Daný skript se nachází v \db\bin\
.
setNetworkServerCP
Třetí krok je spuštění našeho serveru přes příkazový řádek.
(Pozn. pokud používáte českou verzi OS, nezapomeňte vložit ještě
parametr -Duser.language=en
). Samozřejmě skript spusťte jako
administratoři (správci).
Poté spustíme náš server. Zde uvedu několik příkladů pro snadnější pochopení parametrů spuštění DerbyDB serveru.
Následující příkaz spustí server na defaultním portu v ENG verzi OS bez SSL:
java org.apache.derby.drda.NetworkServerControl start
Tato varianta spustí server na portu 3344 v CZ verzi OS bez SSL:
java -Duser.language=en org.apache.derby.drda.NetworkServerControl start -p 3344
Spuštění SSL serveru typu basic v CZ verzi OS s uložištěm JKS. Dle přiloženého obrázku se nám příkaz nespustí a skončí vyjímkou:
java -Duser.language=en -Djavax.net.ssl.keyStore=ulozisteS.jks -Djavax.net.ssl.keyStorePassword=aaa444b org.apache.derby.drda.NetworkServerControl start -p 3344 -ssl basic
Spuštění SSL serveru typu basic v ENG verzi OS s úložištěm PKCS12. Následuje varianta, kterou jsem použil v příkladu, protože mám ENG verzi Win10:
java -Djavax.net.ssl.keyStore=ulozisteNS.jks -Djavax.net.ssl.keyStorePassword=asdasd org.apache.derby.drda.NetworkServerControl start -p 3344 -ssl basic
Spuštění SSL serveru typu basic v CZ verzi OS s úložištěm PKCS12. Pravděpodobně nejvhodnější varianta pro vás:
java -Duser.language=en -Djavax.net.ssl.keyStore=ulozisteNS.jks -Djavax.net.ssl.keyStorePassword=asdasd org.apache.derby.drda.NetworkServerControl start -p 3344 -ssl basic
Server s podporou SSL
se nám úspěšně spustil.
V příští lekci, Derby DB - Bezpečnost - Šifrovaná komunikace SSL/TLS 2, si předvedeme spuštění serveru pro přístup ze sítě a spuštění klienta. Dále si předvedeme jak spolu komunikují.