Programovanie

Vytvárajte zabezpečené sieťové aplikácie pomocou protokolu SSL a rozhrania JSSE API

Internet je nebezpečné miesto. Je jednoducho príliš ľahké sopkať, oklamať a ukradnúť nechránené informácie pri ich prechode po drôtoch. Minulý mesiac som napísal posledný článok v sérii o certifikátoch X.509 a infraštruktúre verejných kľúčov (PKI), technológiách, ktoré zabezpečujú väčšinu aktivít elektronického obchodu na internete. Na konci článku som navrhol pozrieť sa na protokol SSL (Secure Socket Layer), aby ste sa dozvedeli, ako sa certifikáty X.509 používajú v praxi. SSL je zabijácka aplikácia X.509 - podporuje ju takmer každý prehľadávač a najpopulárnejšie webové a aplikačné servery.

Tento mesiac preskúmam SSL implementované v JSSE (Java Secure Socket Extension) a ukážem vám, ako vytvoriť bezpečné sieťové aplikácie v Jave pomocou SSL a JSSE.

Začnime jednoduchou ukážkou. JSSE poskytuje sadu nástrojov SSL pre aplikácie Java. Okrem potrebných tried a rozhraní poskytuje JSSE praktický prepínač ladenia príkazového riadku, ktorý môžete použiť na sledovať protokol SSL v akcii. Okrem poskytnutia užitočných informácií na ladenie nespochybniteľnej aplikácie je hra s touto súpravou skvelým spôsobom, ako si môžete namočiť nohy pomocou protokolu SSL a JSSE.

Ak chcete spustiť ukážku, musíte najskôr zostaviť nasledujúcu triedu:

 public class Test {public static void main (String [] arstring) {try {new java.net.URL ("//" + arstring [0] + "/"). getContent (); } catch (Výnimka výnimka) {exception.printStackTrace (); }}} 

Ďalej musíte zapnúť ladenie SSL a spustiť vyššie uvedenú aplikáciu. Aplikácia sa pripája na zabezpečenú webovú stránku, ktorú zadáte na príkazovom riadku, pomocou protokolu SSL cez HTTPS. Prvá možnosť načíta obslužný program protokolu HTTPS. Druhá možnosť, možnosť ladenia, spôsobí, že program vytlačí svoje správanie. Tu je príkaz (nahradiť zabezpečeného webového servera):

 java -Djava.protocol.handler.pkgs = com.sun.net.ssl.internal.www.protocol -Djavax.net.debug = test SSL 

Musíte si nainštalovať JSSE; Ak si nie ste istí, ako na to, pozrite si Zdroje.

Poďme teraz na vec a poďme sa baviť o SSL a JSSE.

Krátky pohľad na SSL

Kód v úvode demonštruje najjednoduchší spôsob, ako pridať SSL do svojich aplikácií - pomocou java.net.URL trieda. Tento prístup je užitočný, ale nie je dostatočne flexibilný, aby vám umožnil vytvoriť bezpečnú aplikáciu, ktorá používa všeobecné sokety.

Predtým, ako vám ukážem, ako pridať túto flexibilitu, poďme sa rýchlo pozrieť na funkcie protokolu SSL.

Ako už názov napovedá, cieľom SSL je poskytovať aplikáciám bezpečnú sadu nástrojov podobnú soketu. V ideálnom prípade by malo byť ľahké previesť aplikáciu, ktorá používa bežné zásuvky, na aplikáciu, ktorá používa SSL.

SSL rieši tri dôležité bezpečnostné problémy:

  1. Poskytuje autentifikáciu, ktorá pomáha zabezpečiť legitimitu entít zapojených do dialógu.
  2. Poskytuje súkromie. SSL pomáha zaručiť, že tretia strana nemôže dešifrovať dialóg medzi dvoma entitami.
  3. Udržuje integritu. Použitie MAC (autentifikačný kód správy), ktorý je podobný kontrolnému súčtu, pomáha zaručiť, že dialóg medzi dvoma entitami nebude upravený treťou stranou.

SSL sa vo veľkej miere spolieha na kryptografiu s verejným a tajným kľúčom. Využíva kryptografiu s tajným kľúčom na hromadné šifrovanie údajov vymieňaných medzi dvoma aplikáciami. SSL poskytuje ideálne riešenie, pretože algoritmy tajného kľúča sú bezpečné a rýchle. Kryptografia s verejným kľúčom, ktorá je pomalšia ako kryptografia s tajným kľúčom, je lepšou voľbou pre autentifikáciu a výmenu kľúčov.

Referenčná implementácia JSSE od spoločnosti Sun prichádza so všetkou technológiou potrebnou na pridanie protokolu SSL do vašich aplikácií. Zahŕňa podporu kryptografie RSA (Rivest-Shamir-Adleman) - de facto štandard pre bezpečnosť na internete. Zahŕňa implementáciu SSL 3.0 - súčasný štandard SSL - a TLS (Transport Layer Security) 1.0, ďalšia generácia SSL. JSSE tiež poskytuje sadu rozhraní API na vytváranie a používanie zabezpečených zásuviek.

Rozhranie JSSE API

Bezpečnostná architektúra Java používa Továreň dizajnový vzor silno. Pre nezainteresovaných používa návrhový vzor Factory špeciálne továreň objekty na konštrukciu inštancií, namiesto priameho volania ich konštruktorov. (V článku Zdroje nájdete výhody a nevýhody továrenskej triedy.)

V JSSE sa všetko začína továrňou; existuje továreň na zásuvky SSL a továreň na zásuvky servera SSL. Pretože všeobecné zásuvky a zásuvky na server sú už pre programovanie v sieti Java dosť zásadné, predpokladám, že ste s nimi oboznámení a rozumiete ich rolám a rozdielom. Ak nie ste, odporúčam si vziať dobrú knihu o programovaní v sieti Java.

SSLSocketFactory

Metódy v javax.net.ssl.SSLSocketFactory triedy spadajú do troch kategórií. Prvá pozostáva z jednej statickej metódy, ktorá načíta predvolenú továreň na sokety SSL: statická SocketFactory getDefault ().

Druhá kategória pozostáva zo štyroch metód zdedených z javax.net.SocketFactory ktoré odrážajú štyri kľúčové konštruktory nájdené na java.net.Socket triedy a jedna metóda, ktorá obalí existujúci soket soketom SSL. Každý z nich vráti soket SSL:

  1. Socket createSocket (reťazec hostiteľa, int port)
  2. Socket createSocket (reťazec hostiteľa, int port, InetAddress clientHost, int clientPort)
  3. Socket createSocket (hostiteľ InetAddress, int port)
  4. Socket createSocket (hostiteľ InetAddress, int port, InetAddress clientHost, int clientPort)
  5. Socket createSocket (Socket socket, String host, int port, boolean autoClose)

Dve metódy v tretej kategórii vrátia zoznam šifrovacích balíkov SSL, ktoré sú predvolene povolené, a kompletný zoznam podporovaných šifrovacích balíkov SSL:

  1. Reťazec [] getDefaultCipherSuites ()
  2. Reťazec [] getSupportedCipherSuites ()

Šifrovacia sada je kombináciou kryptografických algoritmov, ktoré definujú konkrétnu úroveň zabezpečenia pripojenia SSL. Šifrovacia sada definuje, či je pripojenie šifrované, či je overená integrita obsahu a ako prebieha autentifikácia.

SSLServerSocketFactory

Metódy na javax.net.ssl.SSLServerSocketFactory triedy spadajú do rovnakých troch kategórií ako SSLSocketFactory. Najskôr existuje jediná statická metóda, ktorá načíta predvolenú továreň na socket servera SSL: statický ServerSocketFactory getDefault ().

Metódy, ktoré vracajú zásuvky servera SSL, zrkadlia konštruktory nájdené v java.net.ServerSocket trieda:

  1. ServerSocket createServerSocket (int port)
  2. ServerSocket createServerSocket (int port, int backlog)
  3. ServerSocket createServerSocket (int port, int backlog, InetAddress address)

Nakoniec SSLServerSocketFactory obsahuje dve metódy, ktoré vracajú zoznam šifier, ktoré sú predvolene povolené, a zoznam podporovaných šifier, v uvedenom poradí:

  1. Reťazec [] getDefaultCipherSuites ()
  2. Reťazec [] getSupportedCipherSuites ()

Zatiaľ je API celkom priame.

SSLSocket

Veci sa stávajú zaujímavými v javax.net.ssl.SSLSocket trieda. Predpokladám, že ste už oboznámení s metódami poskytovanými jeho rodičom, Zásuvka triedy, takže sa sústredím na metódy, ktoré poskytujú funkcionalitu spojenú s SSL.

Rovnako ako dve továrenské triedy SSL, aj prvé dve metódy uvedené nižšie načítajú povolené a podporované šifrovacie sady SSL. Tretia metóda nastavuje povolené šifrovacie sady. Aplikácia môže použiť tretiu operáciu na aktualizáciu alebo zníženie úrovne prijateľného zabezpečenia, ktoré aplikácia umožní:

  1. Reťazec [] getEnabledCipherSuites ()
  2. Reťazec [] getSupportedCipherSuites ()
  3. void setEnabledCipherSuites (String [] sady)

Tieto dve metódy určujú, či môže soket nadviazať nové relácie SSL, ktoré zachovajú podrobnosti pripojenia medzi spojeniami, napríklad zdieľaný tajný kľúč,

  1. boolean getEnableSessionCreation ()
  2. void setEnableSessionCreation (logická vlajka)

Nasledujúce dve metódy určujú, či bude soket vyžadovať autentifikáciu klienta. Metódy majú zmysel, iba ak sú vyvolané v soketoch serverového režimu. Pamätajte, že podľa špecifikácie SSL je autentifikácia klienta voliteľná. Napríklad väčšina webových aplikácií to nevyžaduje:

  1. boolean getNeedClientAuth ()
  2. void setNeedClientAuth (boolovská potreba)

Nasledujúce metódy menia soket z klientskeho režimu na serverový. To má vplyv na to, kto iniciuje spojenie SSL a kto sa najskôr autentizuje:

  1. boolean getUseClientMode ()
  2. void setUseClientMode (boolovský režim)

Metóda void startHandshake () vynúti nadviazanie spojenia SSL. Je možné, ale nie bežné, vynútiť si novú operáciu podania ruky v existujúcom spojení.

Metóda SSLSession getSession () načíta reláciu SSL. Málokedy budete musieť pristupovať priamo k relácii SSL.

Dve nižšie uvedené metódy pridávajú a odstraňujú objekt poslucháča nadviazania spojenia SSL. Objekt poslucháča nadviazania spojenia je informovaný vždy, keď je na sokete dokončená operácia spojenia SSL.

  1. void addHandshakeCompletedListener (poslucháč HandshakeCompletedListener)
  2. void removeHandshakeCompletedListener (poslucháč HandshakeCompletedListener)

SSLServerSocket

The javax.net.ssl.SSLServerSocket trieda je obdobou javax.net.ssl.SSLSocket trieda; nevyžaduje si to veľa individuálnej pozornosti. V skutočnosti je súbor metód na javax.net.ssl.SSLServerSocket trieda je podmnožinou metód na javax.net.ssl.SSLSocket trieda.

Prvé dve metódy uvedené nižšie načítajú povolené a podporované šifrovacie sady SSL. Tretia metóda nastavuje povolenú šifrovaciu sadu:

  1. Reťazec [] getEnabledCipherSuites ()
  2. Reťazec [] getSupportedCipherSuites ()
  3. void setEnabledCipherSuites (String [] sady)

Tieto dve metódy určujú, či môže soket servera vytvoriť nové relácie SSL:

  1. boolean getEnableSessionCreation ()
  2. void setEnableSessionCreation (logická vlajka)

Nasledujúce metódy určujú, či prijaté zásuvky budú vyžadovať autentizáciu klienta:

  1. boolean getNeedClientAuth ()
  2. void setNeedClientAuth (logická vlajka)

Nasledujúce metódy menia akceptovaný soket z režimu klienta do režimu servera:

  1. boolean getUseClientMode ()
  2. void setUseClientMode (logická vlajka)

Jednoduchý príklad

Aby bol tento výukový program jasnejší, nižšie som uviedol zdrojový kód jednoduchého servera a kompatibilného klienta. Je to bezpečná variácia typickej echo aplikácie, ktorú poskytuje veľa úvodných textov o sieťach.

Server zobrazený nižšie používa na vytvorenie bezpečnej zásuvky servera JSSE. Na sokete servera počúva pripojenie od zabezpečených klientov. Pri spustení servera musíte určiť úložisko kľúčov, ktoré sa má použiť. Sklad kľúčov obsahuje certifikát servera. Vytvoril som jednoduché úložisko kľúčov, ktoré obsahuje jeden certifikát. (Certifikát si môžete stiahnuť v časti Zdroje.)

import java.io.InputStream; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; public class EchoServer {public static void main (String [] arstring) {try {SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault (); SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket (9999); SSLSocket sslsocket = (SSLSocket) sslserversocket.accept (); InputStream inputstream = sslsocket.getInputStream (); InputStreamReader inputstreamreader = nový InputStreamReader (vstupný prúd); BufferedReader bufferedreader = nový BufferedReader (inputstreamreader); Reťazcový reťazec = null; while ((string = bufferedreader.readLine ())! = null) {System.out.println (string); System.out.flush (); }} catch (Výnimka výnimka) {exception.printStackTrace (); }}} 

Na spustenie servera použite nasledujúci príkaz (foobar je názov súboru úložiska kľúčov a jeho heslo):

 java -Djavax.net.ssl.keyStore = foobar -Djavax.net.ssl.keyStorePassword = foobar EchoServer 

Klient, ktorý je zobrazený nižšie, používa na bezpečné pripojenie k serveru protokol JSSE. Pri spustení klienta musíte určiť dôveryhodné úložisko, ktoré sa má použiť a ktoré obsahuje zoznam dôveryhodných certifikátov. Vytvoril som jednoduchý truststore, ktorý obsahuje jeden certifikát. (Certifikát si môžete stiahnuť v časti Zdroje.)

import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; public class EchoClient {public static void main (String [] arstring) {try {SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault (); SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket ("localhost", 9999); InputStream inputstream = System.in; InputStreamReader inputstreamreader = nový InputStreamReader (vstupný prúd); BufferedReader bufferedreader = nový BufferedReader (inputstreamreader); OutputStream outputstream = sslsocket.getOutputStream (); OutputStreamWriter outputstreamwriter = nový OutputStreamWriter (outputstream); BufferedWriter bufferedwriter = nový BufferedWriter (outputstreamwriter); Reťazcový reťazec = null; while ((string = bufferedreader.readLine ())! = null) {bufferedwriter.write (string + '\ n'); bufferedwriter.flush (); }} catch (Výnimka výnimka) {exception.printStackTrace (); }}} 

Na spustenie klienta použite nasledujúci príkaz (foobar je názov súboru dôveryhodného obchodu a jeho heslo):

 java -Djavax.net.ssl.trustStore = foobar -Djavax.net.ssl.trustStorePassword = foobar EchoClient 
$config[zx-auto] not found$config[zx-overlay] not found