20. diel - DERBY DB - Bezpečnosť - Šifrovaná komunikácia SSL / TLS 2
V minulej lekcii, DERBY DB - Bezpečnosť - Šifrovaná komunikácia SSL / TLS , sme si spustili DerbyDB zatiaľ na localhost.
V tomto tutoriále si predvedieme, ako sa na tento server v rámci LAN
pripojíme, ako na neho cez IJ príkaz tak aj programovo cez Javu uložíme
dáta a opäť ich získame. Komunikáciu v rámci LAN, príp. WAN, sme si
predviedli v 7. lekcii. Prakticky vykonáme podobnú vec, ale komunikácia na
úrovni TCP bude vykonávať cez TLS / SSL. Ako sme si v predchádzajúcej
lekcii povedali, využijeme PKCS12 typ kľúčového úložisko
ulozisteNS.jks
, ktorý sme si minule vytvorili. Server DB pobeží
na IPv4 192.168.123.30
, ENG OS a klient na IPv4
192.168.123.6
, CZ OS. Pre komunikáciu využijeme port
3344
. Server odporúčam spustiť v režime Administrátor.
Spustenie SSL servera typu basic v CZ verzii OS s úložiskom PKCS12 prevedieme príkazom:
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
Pripojenie na server cez IJ
Ako prvú vec si spustíme príkazový riadok na klientovi. Ako vidíte, z
priloženého snímky obrazovky, tak klienta spúšťam na Java8_201 (posledná
public verzia Java8). Ako ďalšie je nutné spustiť spúšťací skript
setNetworkClientCP. Potom si spustíme príkazový interpret
IJ, avšak cez Javu a to príkazom java org.apache.derby.tools.ij
.
Pre istotu si vypnite firewall, aby vám to fungovalo. Ja mám LAN ako private
sieť, takže som potreboval vypnúť iba private. U vás to môže byť inak.
Prípadne si nastavte vo firewalle výnimku. Až vyskúšate príklad, tak
firewall nezabudnite opäť nastaviť:
Ako prvý sa samozrejme najskôr prihlásime a vytvoríme databázu
pomenovanú databaze11
, vložíme dáta a odhlásime sa. Pre
zjednodušenie nebudeme riešiť žiadne šifrovanie v databáze. Ako vidíte,
na klientovi sa nastavuje iba parameter ssl=basic
. Pokiaľ nebude
súčasťou príkazu connect
, pripojenie sa neuskutoční.
Vyskúšajte si to, nič sa pokazí. Zvyšok parametrov pripojenia pozná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;
Potom sa znova prihlásime a dáta si prečítame:
ij> connect 'jdbc:derby://192.168.123.30:3344/databaze11;ssl=basic;user=uzivatel1;password=heslo1'; ij> SELECT * FROM DerbyTABLE; ij> disconnect; ij> exit;
Ako vidíte, všetko funguje:
Pripojenie databázy programovo
Samozrejme čo by to bol za článok o Jave, keby sme si to nepredviedli cez Javu, že? Zas si vytvoríme testovací príklad v Java SE ako projekt v IDE. V menu zvolíme File -> New -> Java Project. Projekt pomenujeme a nastavíme JRE Java8.
Opätovne pridáme externé knižnice do nášho projektu do
CLASSPATH
. Ide o tieto externé knižnice:
derbyclient.jar
derby.jar
derbytools.jar
derbyoptionaltools.jar
Tu je vidieť riešený zdrojový kód. V programe sa len pripájame a
získavame dáta. Jedná sa o tie dáta, ktoré sme do databázy vložili cez
IJ tool. Opäť si môžete vyskúšať odstrániť z reťazca
pripojenia ssl=basic
. Ak tam nebude, pripojenie zlyhá.
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 metóde vypisemeData()
je skopírovaný z nejakého
staršieho príkladu a preto nedáva logicky zmysel. Podstatou článku je
predviesť princíp pripojenie cez SSL typ basic a ten funguje.
Ako vidíte, všetko opäť funguje. Toto riešenie je vcelku dobré, problémom je iba doba trvania odoslanie certifikátu na serveri a jeho výmena.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 3x (4.5 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java