Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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
Spuštění serveru LAN - Derby DB

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

VypnutiFirewallu - Derby DB

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:

PripojeniPresIJ - Derby DB

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.

Tvorba Java projektu - Derby DB

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
Externí knihovny - Derby DB

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.

Funkční spojení - Derby DB

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 2x (4.5 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Derby DB - Bezpečnost - Šifrovaná komunikace SSL/TLS
Všechny články v sekci
Derby DB
Přeskočit článek
(nedoporučujeme)
Derby DB - Bezpečnost - Šifrovaná komunikace SSL/TLS 3
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
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