Lekce 20 - Derby DB - Bezpečnost - Šifrovaná komunikace SSL/TLS 2
V minulé lekci, Derby DB - Bezpečnost - Šifrovaná komunikace SSL/TLS, jsme si spustili DerbyDB zatím na localhostu.
V tomto tutoriálu si předvedeme, jak se na tento server v rámci LAN
připojíme, jak na něj přes IJ příkaz tak i programově přes Javu
uložíme data a opět je získáme. Komunikaci v rámci LAN, příp. WAN, jsme
si předvedli v 7. lekci. Prakticky provedeme podobnou věc, ale komunikace na
úrovni TCP bude prováděna přes TLS/SSL. Jak jsme si v předchozí lekci
řekli, využijeme PKCS12 typ klíčového uložiště
ulozisteNS.jks
, jenž jsme si minule vytvořili. Server DB
poběží na IPv4 192.168.123.30
, ENG OS a klient na IPv4
192.168.123.6
, CZ OS. Pro komunikaci využijeme port
3344
. Server doporučuji spustit v režimu Administrátor.
Spuštění SSL serveru typu basic v CZ verzi OS s úložištěm PKCS12 provedeme příkazem:
java -Duser.language=en -Djavax.net.ssl.keyStore=ulozisteNS.jks -Djavax.net.ssl.keyStorePassword=asdasd org.apache.derby.drda.NetworkServerControl start -h 192.168.123.30 -p 3344 -ssl basic

Připojení na server přes IJ
Jako první věc si spustíme příkazový řádek na klientovi. Jak vidíte,
z přiloženého snímku obrazovky, tak klienta spouštím na Java8_201
(poslední public verze Java8). Jako další je nutné spustit spouštěcí
skript setNetworkClientCP. Poté si spustíme příkazový
interpret IJ, ovšem přes Javu a to příkazem
java org.apache.derby.tools.ij
. Pro jistotu si vypněte firewall,
aby vám to fungovalo. Já mám LAN jako private síť, takže jsem potřeboval
vypnout pouze private. U vás to může být jinak. Případně si nastavte ve
firewallu výjimku. Až vyzkoušíte příklad, tak firewall nezapomeňte opět
nastavit:

Jako první se samozřejmě nejdříve přihlásíme a vytvoříme databázi
pojmenovanou databaze11
, vložíme data a odhlásíme se. Pro
zjednodušení nebudeme řešit žádné šifrování v databázi. Jak vidíte,
na klientovi se nastavuje pouze parametr ssl=basic
. Pokud nebude
součástí příkazu connect
, připojení se neprovede.
Vyzkoušejte si to, nic se pokazí. Zbytek parametrů připojení znáte:
ij> connect 'jdbc:derby://192.168.123.30:3344/databaze11;create=true;ssl=basic;user=uzivatel1;password=heslo1'; ij> CREATE TABLE DerbyTABLE(sloupec1 CHAR(10), sloupec2 CHAR(20), sloupec3 INTEGER); ij> INSERT INTO DerbyTABLE VALUES ('text11','text12',7),('text21','text22',6),('text31','text32',14); ij> INSERT INTO DerbyTABLE VALUES ('text41','text42',12),('text51','text52',354),('text61','text62',778); ij> SELECT * FROM DerbyTABLE; ij> disconnect; ij> exit;
Pak se znovu přihlásíme a data si přečteme:
ij> connect 'jdbc:derby://192.168.123.30:3344/databaze11;ssl=basic;user=uzivatel1;password=heslo1'; ij> SELECT * FROM DerbyTABLE; ij> disconnect; ij> exit;
Jak vidíte, vše funguje:

Připojení k databázi programově
Samozřejmě co by to byl za článek o Javě, kdybychom si to nepředvedli přes Javu, že? Zas si vytvoříme testovací příklad v Java SE jako projekt v IDE. V menu zvolíme File -> New -> Java Project. Projekt pojmenujeme a nastavíme JRE Java8.

Opětovně přidáme externí knihovny do našeho projektu do
CLASSPATH
. Jedná se o tyto externí knihovny:
derbyclient.jar
derby.jar
derbytools.jar
derbyoptionaltools.jar

Zde je vidět řešený zdrojový kód. V programu se pouze připojujeme a
získáváme data. Jedná se o ta data, která jsme do databáze vložili přes
IJ tool. Opět si můžete vyzkoušet odstranit z řetězce
připojení ssl=basic
. Pokud tam nebude, připojení se
nezdaří.
package net; import java.sql.*; public class PripojeniSSL { private static Connection connect = null; private static Statement statement = null; private static ResultSet odpoved = null; static { try { Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { System.out.println("Problem s nactenim driveru - nutne pridat do CLASSPATH"); } } private static void pripojeniDatabazeLAN() { try { connect = DriverManager.getConnection("jdbc:derby://192.168.123.30:3344/databaze11;ssl=basic;user=uzivatel1;password=heslo1'"); System.out.println("Podarilo se pripojit k databazi11"); } catch (Exception e) { System.err.println("Nepodarilo se pripojit k databazi11"); if (connect == null) { System.exit(1); } } } private static void vypisemeData() { try { statement = connect.createStatement(); odpoved = statement.executeQuery("SELECT * FROM DerbyTABLE"); System.out.print("Podarilo se ziskat data :"); while (odpoved.next()) { System.out.print("\nJmeno :" + odpoved.getString(1)); System.out.print("\tPrijmeni :" + odpoved.getString(2)); System.out.print("\tMail:" + odpoved.getString(3)); } } catch (SQLException e) { System.out.println("Nepovedlo se ziskat data :"); e.printStackTrace(); } } private static void odpojimeDatabazi() { // zrusime objekty try { if (statement != null) { statement.close(); } if (connect != null) { connect.close(); } System.out.println("\nPodarilo se odpojit od databaze"); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println("Start Programu"); pripojeniDatabazeLAN(); vypisemeData(); odpojimeDatabazi(); System.out.println("Konec Programu"); } }
Výpis v metodě vypisemeData()
je zkopírován z nějakého
staršího příkladu a proto nedává logicky smysl. Podstatou článku je
předvést princip připojení přes SSL typ basic a ten funguje.

Jak vidíte, vše opět funguje. Toto řešení je vcelku dobré, problémem je pouze doba trvání odeslání certifikátu na serveru a jeho výměna.
V příští lekci, Derby DB - Bezpečnost - Šifrovaná komunikace SSL/TLS 3, se naučíme provádět PeerAuthentication (uzlové ověření)
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 3x (4.5 kB)
Aplikace je včetně zdrojových kódů v jazyce Java