Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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
Spustenie servera LAN - DerbyDb

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 setNetworkCli­entCP. 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ť:

VypnutiFirewallu - DerbyDb

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:

PripojeniPresIJ - DerbyDb

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.

Tvorba Java projektu - DerbyDb

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
externé knižnice - DerbyDb

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.

funkčné spojenie - DerbyDb

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

 

Predchádzajúci článok
DERBY DB - Bezpečnosť - Šifrovaná komunikácia SSL / TLS
Všetky články v sekcii
DerbyDb
Preskočiť článok
(neodporúčame)
Derby DB - Bezpečnosť - Šifrovaná komunikácia SSL / TLS 3
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity