Java Security Extensions

Preview:

DESCRIPTION

Java Security Extensions. M nožina balíkov v Jave, ktorá sa týka bezpečnosti:. b ezpečnosti prístupu k zdrojom výpočtových prostriedkov šifrovaním bezpečnosti v komunikácii. Zloženie:. - PowerPoint PPT Presentation

Citation preview

Množina balíkov v Jave, ktorá sa týka bezpečnosti:

• bezpečnosti prístupu k zdrojom výpočtových prostriedkov

• šifrovaním

• bezpečnosti v komunikácii

Zloženie:

Java Authentication and Authorization Service - bezpečnosť z hľadiska prístupu k zdrojom výpočtových prostriedkov

Java Cryptography Architecture a Java Cryptography Extension – šifrovanie

Java Secure Socket Extension - bezpečná internetová komunikácia.

Použitie:

Autentifikácia používateľov - na dôveryhodné a bezpečné určenie, kto práve vykonáva javovský kód

Autorizácia používateľov - na uistenie, že majú prístupové práva požadované na vykonávanie operácie

Zloženie:

Spoločné triedy - Subject, Principal, Credential

Autentifikačné triedy a rozhrania - LoginContext, LoginModule, CallbackHandler, Callback

Autorizačné triedy - Policy, AuthPermission, PrivateCredentialPermission

Architektúra autentifikácie

aplikáciapožiadavka

na autentifikáciu

konfiguračný login súbor

prihlásenie

komunikácia s používateľom

identifikácia používateľa

aplikácia s identifikovaným

používateľom

Štruktúra priebehu autentifikácie:

autor autentifikačnej technológie

autor aplikácie

Autentifikácia v JAAS

aplikáciaLoginContext.

login()

konfiguračný login súbor

LoginModule

CallbackHandler

SubjectPrincipal

aplikácia s objektom Subject určujúcim

používateľa

autor autentifikačnej technológie

autor aplikácie

Použitie tried v architektúre autentifikácie:

Zakomponovanie JAAS do aplikácie

Vytvorenie objektu triedy javax.security.auth.login.LoginContext

import javax.security.auth.login.*;. . .LoginContext lc = new LoginContext(<config file entry name>, <CallbackHandler to be used for user interaction>);

Príklad:

import javax.security.auth.login.*;. . .LoginContext lc = new LoginContext("Sample", new MyCallbackHandler());

Zakomponovanie JAAS do aplikácie (2)

zavolanie metódy login() na našom vytvorenom LoginContexte

Príklad:

lc.login();

Ak po zavolaní tejto metódy nevzniknú žiadne výnimky LoginException alebo SecurityException (označujúce, že autentifikácia nebola úspešná), používateľ bol úspešne autentifikovaný.

Zakomponovanie JAAS do aplikácie (3)

Pre komunikáciu s používateľom slúži rozhranie CallbackHandler.

Má jedinú metódu:

void handle(Callback[] callbacks) throws java.io.IOException, UnsupportedCallbackException;

Spracúvajú sa v nej informácie a požiadavky, ktoré vyžadujú interakciu s používateľom. Potrebné Callbacky sú naplnené autentifikačným procesom. Môže sa stať, že metóda nie je vôbec zavolaná (napríklad pri autentifikácii odtlačkom prsta). Potrebné informácie je možné nájsť v dokumentácii k prihlasovacej rutine.

Zakomponovanie JAAS do aplikácie (4)

Príklad CallbackHandlera:

public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) {

if (callbacks[i] instanceof TextOutputCallback) {TextOutputCallback toc = (TextOutputCallback)callbacks[i];switch (toc.getMessageType()) {

//spracovanie podľa druhu informácie}

} else if (callbacks[i] instanceof NameCallback) {NameCallback nc = (NameCallback)callbacks[i];System.err.print(nc.getPrompt());

System.err.flush(); nc.setName((new BufferedReader(new InputStreamReader(System.in))).readLine());

} else if (callbacks[i] instanceof PasswordCallback) {PasswordCallback pc = (PasswordCallback)callbacks[i];

System.err.print(pc.getPrompt()); System.err.flush(); pc.setPassword(readPassword(System.in));

} else { throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); }

} }

Zakomponovanie JAAS do aplikácie (5)

Vytvorenie konfiguračného login súboru a zapísanie vstupu:

Sample { JAAS.module.SampleLoginModule required debug=true;};

Sample je reťazec, ktorý identifikuje vstup v tomto konfiguračnom súbore. Ten sme uvádzali pri vytváraní LoginContextu. Obsahom je trieda, ktorá uskutoční prihlasovanie, potom nutnosť úspešného prihlásenia v tejto triede a prípadne aj nejaké nastavenia, ktoré sa použijú v autentifikačnej technológii.

Zakomponovanie JAAS do aplikácie (6)

Možnosti pri uvádzaní, či daná autentifkácia je nevyhnutná:

required – nutné pre úspešné prihlásenie celého procesu

optional – voliteľné prihlásenie, nie je nevyhnutné na úspech celého prihlasovacieho procesu

requisite – potrebné, aby sa mohlo v procese pokračovať

sufficient – ak je úspešné neberie sa ohľad na úspech ďalšieho procesu

Zakomponovanie JAAS do aplikácie (7)

failfailfailfailfailpasspasspassOverall Authentication

*failpass**failpass*optionalKerberos

failpasspass*failpasspass*requisiteSmartCard

failfailfailpassfailfailfailpasssufficientNTLoginModule

failfailfailfailpasspasspasspassrequiredSampleLoginModule

Login2 Authentication Status

Výsledok celkovej autentifikácie na základe výsledkov čiastkových autentifikácií:

Zakomponovanie JAAS do aplikácie (8)

Po vytvorení aplikácie a jej skompilovaní, potrebujeme pri spúšťaní uviesť údaj o tom, ktorý súbor sa má používať ako konfiguračný login súbor. To sa urobí uvedením parametra interpreta, ako je uvedené nasledovne:

java –Djava.security.auth.login.config=jaas_login_config_path MainClass

Predpokladajme, že máme aplikáciu umiestnenú v balíčku JAAS, meno konfiguračného login súboru je sample_jaas.config a názov hlavnej triedy SampleAcn.class. Potom bude príkaz vyzerať nasledovne:

java –Djava.security.auth.login.config=JAAS/sample_jaas.config JAAS.SampleAcn

Policy súbor

Keďže už vieme identifikovať, ktorý používateľ aplikáciu práve používa, môžeme pristúpiť k druhej fáze a to určeniu, či má alebo nemá práva používať požadované prostriedky. Na určenie, ktorí používatelia majú aké práva sa používa tzv. policy súbor.

Prístupové práva sa v ňom určujú na základe:

• umiestnenia kódu

• podpisu aplikácie

• používateľa aplikácie

Policy súbor (2)

Položky v policy súbore majú nasledovnú syntax:

grant <signer(s) field>, <codeBase URL> <Principal field(s)> { permission perm_class_name "target_name", "action"; .... permission perm_class_name "target_name", "action";};

Principal field má nasledovnú syntax:

Principal Principal_class "principal_name"

Policy súbor (3)

Príklad položky v policy súbore:

grant codebase "file:./SampleAction.jar„ Principal JAAS.principal.SamplePrincipal "testUser" { permission java.util.PropertyPermission "java.home", "read";

permission java.util.PropertyPermission "user.home", "read"; permission java.io.FilePermission "foo.txt", "read";};

Zakomponovanie autorizácie do aplikácie

Používateľ je po autentifikácii v JAAS určený:

objektom triedy Subject, ktorý je jeden pre každého používateľa používajúceho systém

jedným alebo niekoľkými objektmi rozhrania Principal, ktoré nejakým spôsobom identifikujú používateľa (napríklad meno alebo identifikačné číslo). Týmito objektmi je naplnená trieda Subjekt

Zakomponovanie autorizácie do aplikácie (2)

Subjekt je jeden pre všetky LoginModuly, ktorými prebieha autentifikácia.

Po úspešnej autentifikácii každý z LoginModulov naplní tento Subjekt objektmi rozhrania Principal, napríklad cestou, ako je uvedené na príklade:

userPrincipal = new SamplePrincipal(username);if (!subject.getPrincipals().contains(userPrincipal))

subject.getPrincipals().add(userPrincipal);

Zakomponovanie autorizácie do aplikácie (3)

Keďže máme úspešne autorizovaného používateľa, môžeme spustiť určitý kód, ktorého vykonávanie bude ním označené (teda kód bude spúšťaný konkrétnym používateľom).

Metódy, ktoré umožňujú spúšťať kód identifikovaný daným používateľom:

Subject.doAs()

Subject.doAsPrivileged()

Subject mySubject = lc.getSubject();PrivilegedAction action = new SampleAction();Subject.doAsPrivileged(mySubject, action, null);

Zakomponovanie autorizácie do aplikácie (3)

Pre overenie funčnosti naše aplikácie potrebujeme mať zavedený SecurityManager, ktorý bude kontrolovať, či sú splnené požiadavky uvedené v policy súbore.

Pre aplikáciu je to možné urobiť nasledovne:

java -Djava.security.manager -Djava.security.policy=JAAS/sampleazn.policy JAAS.SampleAcn-Djava.security.auth.login.config=JAAS/sample_acn.config

Hlavné princípy:

algoritmická nezávislosť – na základe definovania šifrovacích rutín je možné použiť rôzne algoritmy rovnakým spôsobom

implementačná nezávislosť – tie isté algoritmy môžu byť implementované rôznymi autormi (poskytovateľmi) a používateľ má možnosť vybrať si, ktorého použije

Postup pri určovaní konkrétnej implementácie algortimu

Predpokladajme, že máme nainštalovaných dvoch poskytovateľov PROVIDER_1 a PROVIDER_2. Predpokladajme, že:

PROVIDER_1 implementuje SHA1withDSA, SHA-1, MD5, DES a DES3 PROVIDER_1 má prioritu 1 (najvyššia priorita)

PROVIDER_2 implementuje SHA1withDSA, MD5withRSA, MD2withRSA, MD2, MD5, RC4, RC5, DES a RSAPROVIDER_2 má prioritu 2

Postup pri určovaní konkrétnej implementácie algortimu(2)

Pozrime sa na štyri scenáre:

1. Ak hľadáme implementáciu MD5. Obidvaja poskytovatelia implementujú takúto službu. Bude použitý PROVIDER_1 nakoľko má najvyššiu prioritu a je prehľadaný ako prvý

2. Ak hľadáme implementáciu MD5withRSA algoritmus podpisu, je prehľadaný PROVIDER_1. Implementácia nie je nájdená, preto sa prehľadá PROVIDER_2. Nakoľko tento danú službu implementuje, je preto použitý

3. Predpokladajme, že hľadáme algoritmus podpisu SHAwithRSA. Nakoľko žiadny poskytovateľ takúto službu neimplementuje, je vyhodená výnimka NoSuchAlgorithmException

4. Ak hľadáme implementáciu MD5, ale uvedieme, že chceme použiť PROVIDER_2, potom, ak je tento poskytovateľ nainštalovaný a implementuje danú službu, potom je použitý. Inak je vyhodená výnimka NoSuchProviderException alebo NoSuchAlgorithmException

Rutinné triedy a algoritmy

• MessageDigest• Signature• KeyPairGenerator• KeyFactory• CertificateFactory• KeyStore• AlgorithmParameters• AlgorithmParameterGenerator• SecureRandom

Vo verzii Javy 1.4. boli pridané nasledovné rutiny

• CertPathBuilder• CertPathValidator• CertStore

Vytváranie objektov rutín

Vytváranie objektov všetkých rutín prebieha cez nasledovné statické metódy, ktoré obsahuje každá rutina:

getInstance(String algorithm)

getInstance(String algoritm, String provider)

getInstance(String algorithm, Provider provider)

MessageDigest

Trieda implementuje kryptograficky bezpečný výber zo správy. Reprezentuje tzv. hashovacie kryptovanie, keď z ľubovoľne dlhej správy vytvorí reťazec konštantnej dĺžky, z ktorého sa nedá odvodiť pôvodná správa a mal by byť pre každú správu iný.

MessageDigest sha = MessageDigest.getInstance("SHA-1");sha.update(i1);sha.update(i2);sha.update(i3);byte[] hash = sha.digest();

Signature

Trieda implementuje funkcionalitu spojenú s digitálnymi podpismi. Umožňuje podpisovanie správ a taktiež kontrolu správnosti podpisu (verifikáciu).

Signature dsa = Signature.getInstance("SHA1withDSA");PrivateKey priv = pair.getPrivate();dsa.initSign(priv);dsa.update(data);byte[] sig = dsa.sign();

Signature dsa = Signature.getInstance("SHA1withDSA");PublicKey pub = pair.getPublic();dsa.initVerify(pub);dsa.update(data);boolean verifies = dsa.verify(sig);

AlgorithmParameters, AlgorithmParameterSpec,

AlgorithmParameterGenerator Tieto triedy a rozhrania slúžia na reprezentáciu parametrov jednotlivých algoritmov a na ich generovanie. Reprezentujú parametre buď v nepriehľadnej forme, v ktorej je možné k parametrom pristupovať len ako k celku (AlgorithmParameters) alebo v transparentnej forme, v ktorej je možné ku každému parametru zvlášť. Trieda AlgorithmParameterGenerator slúži na generovanie týchto parametrov buď nezávisle na algoritme (napríklad zadaním veľkosti kódovacej postupnosti a generátora náhodných čísel) alebo priamo nastaveniami pre konkrétny algoritmus (nastavenie dopĺňania prázdnych miest a pod.)

AlgorithmParameterGenerator apg = AlgorithmParameterGenerator.getInstance("DSA");AlgorithmParameters ap = apg.generateParameters();AlgorithmParameterSpec aps = ap.getParameterSpec(DSAParameterSpec.class);((DSAParameterSpec)aps).getP();

Key, KeySpec, KeyFactory

Key je rozhranie, ktoré zastrešuje všetky triedy, ktoré reprezentujú nepriehľadný kľúč (nemáme prístup k materiálu z ktorého sa kľúč skladá). KeySpec reprezentuje rozhranie zahŕňajúce triedy, ktoré obsahujú kľúč uložený v transparentnej forme. To znamená, že sa vieme dostať k jednotlivým zložkám kľúča (napríklad pri asymetrických algoritmoch k prvočíslu tvoriacemu kľúč, k modulu a pod.) Nepriehľadné a transparentné reprezentácie môžu byť konvertované jedna na druhú pomocou triedy KeyFactory.

KeyFactory keyFactory = KeyFactory.getInstance("DSA");DSAPublicKeySpec dsaPubKeySpec = new DSAPublicKeySpec(y, p, q, g);PublicKey pubKey = keyFactory.generatePublic(dsaPubKeySpec);byte[] encKey = pubKey.getEncoded();X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encodedPubKey);pubKey = keyFactory.generatePublic(pubKeySpec);

KeyGenerator, KeyPairGenerator, KeyPair

Triedy slúžia na generovanie kľúčov pre symetrické šifrovanie (KeyGenerator) alebo asymetrické šifrovanie (KeyPairGenerator). Trieda KeyPair slúži na uchovanie dvojice privátny/verejný kľúč pri asymetrickom šifrovaní.

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");Key k = keyGen.generateKey();

CertificateFactory

Použitie tejto triedy je pri vytváraní Certifikátov. Umožňuje načítanie certifikátov zo streamov podľa štandardov, podľa ktorých sú tieto certifikáty uložené. Súčasne umožňuje generovanie Certifikačných ciest a CRL listov

FileInputStream fis = new FileInputStream(filename);BufferedInputStream bis = new BufferedInputStream(fis);CertificateFactory cf = CertificateFactory.getInstance("X.509");while (bis.available() > 0) { Certificate cert = cf.generateCertificate(bis); System.out.println(cert.toString());}

KeyStore

Databáza a zároveň trieda, ktorá reprezentuje uložené kľúče a dôveryhodné certifikáty a umožňuje ich správu. Každý prvok v KeyStore je identifikovaný „alias“ reťazcom. KeyStore môže byť rôzneho typu (štandardne „jks“), ktoré určujú spôsob uloženia tohto skladu. Databáza môže byť chránená heslom. Taktiež kľúče uložené v tejto databáze môžu byť chránené samostatným heslom.

ks = KeyStore.getInstance("JKS");

ks.load(new FileInputStream("JSSE/sockets/server/testkeys"), passphrase);

SecureRandom

Generátor náhodných čísel na základe semienka.

DSAParameterSpec dsaSpec = new DSAParameterSpec(p, q, g);SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");random.setSeed(userSeed);keyGen.initialize(dsaSpec, random);

Implementované algoritmy

MessageDigestMD2MD5SHA-1SHA-256, SHA-384 a SHA-512

SignatureMD2withRSAMD5withRSASHA1withDSASHA1withRSA

KeyPairGenerator, KeyFactory, AlgorithmParameterGenerator, AlgorithmParameters

DSARSA

Implementované algoritmy (2)

SecureRandomSHA1PRNG

CertificateFactoryX.509

KeyStore JKSPKCS12

Rozšírenie JCA spočívajúce:

vo väčšom počte šifrovacích algoritmov

v možnosti šifrovania symetrickými kľúčmi

v pridaní implementácie KeyAgreement protokolu

v pridaní šifrovanej práce s prúdmi údajov

v možnosti šifrovať akýkoľvek objekt

Cipher

Trieda, ktorá tvorí jadro JCE štruktúry

Vykonáva šifrovanie a dešifrovanie (symetrické aj asymetrické)

Výber algoritmu s možnosťou uvedenia dodatočných atribútov mode a padding

Zachovaná filozofia z JCA – vytvorenie inštancie pomocou getInstance()

Cipher (2)

Postup pri práci s triedou Cipher:

• vytvorenie inštancie s požadovaným algoritmom, módom a paddingom (algorithm/mode/padding)

• inicializácia požadovaným typom operácie a kľúčom

• naplnenie dátami

• vykonanie šifrovania (dešifrovania)

KeyGenerator kgen = KeyGenerator.getInstance("Blowfish");SecretKey skey = kgen.generateKey();Cipher cipher = Cipher.getInstance("Blowfish");cipher.init(Cipher.ENCRYPT_MODE, skey);byte[] encrypted = cipher.doFinal("This is just an example".getBytes());

// cipher.update("This is just ".getBytes());// cipher.update("an example".getBytes());// byte[] encrypted = cipher.doFinal();

CipherInputStream, CipherOutputstream

Poskytujú možnosť pracovať s prúdmi a kryptovaním. Triedy CipherInputStream a CipherOutputStream rozširujú triedy FilterInputStream a FilterOutputStream. Je možné nimi zaobaliť vstupný alebo výstupný prúd

FileInputStream fis;FileOutputStream fos;CipherInputStream cis;fis = new FileInputStream("/tmp/a.txt");cis = new CipherInputStream(fis, cipher1);fos = new FileOutputStream("/tmp/b.txt");byte[] b = new byte[8];int i = cis.read(b);while (i != -1) {

fos.write(b, 0, i);i = cis.read(b);

}

SecretKeyFactory, KeyGenerator

Fungujú obdobne ako KeyFactory a KeyGenerator v JCA.

SealedObject

Reprezentuje kryptovaný objekt Javy. Pre kryptovanie je možné použiť akýkoľvek z algoritmov, ktoré je možné použiť pre Cipher.

Cipher c = Cipher.getInstance("DES");c.init(Cipher.ENCRYPT_MODE, sKey);SealedObject so = new SealedObject("This is a secret", c);c.init(Cipher.DECRYPT_MODE, sKey);try {

String s = (String)so.getObject(c);} catch (Exception e) {}

KeyAgreement

Poskytuje možnosť používania key agreement protokolu. Ide o spôsob, ako si dve a viac osôb môže vytvoriť spoločný kľúč, ktorý je rovnaký bez toho, aby si tento kľúč museli medzi sebou priamo vymeniť.

Postup pri vytváraní tohto kľúča je nasledovný:

• vytvorenie páru privátny/verejný kľúč každou z osôb, ktoré chcú zdieľať

• inicializácia svojho KeyAgreement objektu svojím privátnym kľúčom

• výmena verejných kľúčov medzi osobami

• vykonanie fázy na svojom KeyAgreement objekte s cudzím verejným kľúčom

• výmena medzikľúčov z prvej fázy a vykonanie fázy s týmito kľúčmi (táto časť sa opakuje niekoľko krát podľa počtu osôb, ktoré chcú zdieľať)

• konečná fáza – vytvorenie kľúča, ktorý bude pre všetky osoby rovnaký

KeyAgreement (2)

0. private key

0. private key

0. private key

2. phase key

2. phase key

1. public key1. public key

Bob

Alice

Carol

1. public key

2. phase key

Príklad procesu vytvárania kľúča pre tri osoby

MAC

Poskytuje funkcionalitu pre Message Authentication Code. Je obdobou podpisových algoritmov. Inicializuje sa kľúčom a spúšťa sa nad dátami.

KeyGenerator kg = KeyGenerator.getInstance("HmacMD5");SecretKey sk = kg.generateKey();Mac mac = Mac.getInstance("HmacMD5");mac.init(sk);byte[] result = mac.doFinal("Hi There".getBytes());

Implementované algoritmyAlgorithm

AESBlowfishDESDESedePBEWith<digest>And<encryption> or PBEWith<prf>And<encryption>

PBEWithMD5AndDESPBEWithHmacSHA1AndDESede

RC2, RC4 a RC5RSA

ModeNONE CBCCFBECBOFBPCBC

PaddingNoPadding OAEPWith<digest>And<mgf>Padding

OAEPWithMD5AndMGF1Padding. PKCS5PaddingSSL3Padding

Cipher

Implementované algoritmy (2)

KeyAgreementDiffieHellman

KeyGeneratorAES Blowfish DES DESede HmacMD5 HmacSHA1

KeyPairGeneratorDiffieHellman

SecretKeyFactoryAES DES DESede PBEWith<digest>And<encryption> or PBEWith<prf>And<encryption>

PBEWithMD5AndDESPBEWithHmacSHA1AndDESede

Implementované algoritmy (3)

KeyFactoryDiffieHellman

AlgorithmParameterGeneratorDifiieHellman

AlgorithmParametersBlowfish DES DESede DiffieHellman PBE

MACHmacMD5HmacSHA1PBEWith<mac>

PBEWithHmacSHA1

KeyStoreJCEKS

Umožňuje bezpečnú internetovú komunikáciu zabezpečením:

autentifikácie servera

šifrovaním vymieňaných dát

overovaním integrity správ

možnosťou autentifikácie klienta

Podporované protokoly:

SSL 2.0

SSL 3.0

TSL 1.0

Algoritmy používané v JSSE

1024hromadné kryptovanieDSA

1024512

key agreementDiffie - Hellman

192 (112 efektívnych)hromadné kryptovanieTriple DES

64 (56 efektívnych)64 (40 efektívnych)

hromadné kryptovanieDES

128128 (40 efektívnych)

hromadné kryptovanieRC4

2048 (autentifikácia)2048 (výmena kľúčov)512 (výmena kľúčov)

Autentifikácia a výmena kľúčov

RSA

Dĺžka kľúča (bitov)kryptografický proceskryptovací algoritmus

Hierarchia tried v rámci JSSE

SocketFactory, ServerSocketFactory, SSLSocket, SSLServerSocket, SSLSocketFactory,

SSLServerSocketFactory

Vytvárajú a spravujú bezpečné spojenie.

Transformácia obyčajného spojenia na bezpečné (server):

import java.io.*;import java.net.*;. . .int port = availablePortNumber;ServerSocket s;try { s = new ServerSocket(port); Socket c = s.accept(); OutputStream out = c.getOutputStream(); InputStream in = c.getInputStream();}catch (IOException e) {}

import java.io.*;import javax.net.ssl.*;. . .int port = availablePortNumber;SSLServerSocket s;try { SSLServerSocketFactory sslSrvFact = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); S = (SSLServerSocket) sslSrvFact.createServerSocket(port); SSLSocket c = (SSLSocket)s.accept(); OutputStream out = c.getOutputStream(); InputStream in = c.getInputStream();}catch (IOException e) {}

Transformácia obyčajného spojenia na bezpečné (klient):

import java.io.*;import java.net.*;. . .int port = availablePortNumber;String host = "hostname";try { s = new Socket(host, port); OutputStream out = s.getOutputStream(); InputStream in = s.getInputStream();}catch (IOException e) {}

import java.io.*;import javax.net.ssl.*;. . .int port = availablePortNumber;String host = "hostname";try { SSLSocketFactory sslFact = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket s = (SSLSocket) sslFact.createSocket(host, port); OutputStream out = s.getOutputStream(); InputStream in = s.getInputStream();}catch (IOException e) {}

SSLContext

slúži ako Factory na výrobu SocketFactories

je automaticky vytvorený v prípade, že zavoláme SocketFactory.getDefault()

môžeme vytvoriť vlastnú inštanciu SSLContextu, ak chceme mať lepšiu kontrolu napríklad nad tým, akými protokolmi sa bude spojenie riadiť

môžeme nastaviť certifikáty a kľúče, podľa ktorých sa bude kontrolovať spojenie

TrustManager, TrustManagerFactory

Primárnou zodpovednosťou je rozhodnúť, či nájdené autentifikačné poverovacie listiny (credentials) sú dôveryhodné

Na autentifikáciu vzdialeného servera je potrebné vytvoriť SSLContext s jedným alebo viacerými TrustManagermi

Je potrebné dodať jeden TrustManager pre každý autentifikačný mechanizmus, ktorý je podporovaný

TrustManagerFactory slúži na vytvorenie TrustManagera na základe zadaných atribútov

možnosť inicializovať databázou, ktorá sa nachádza v KeyStore alebo pomocou parametrov

KeyManager, KeyManagerFactory

Primárnou zodpovednosťou je vybrať autentifikačné listiny (credentials), ktoré budú poslané pri autentifikácii klienta servru

Pracuje sa s ním rovnako ako s TrustManagerom (výber listín pre každý mechanizmus autentifikácie)

KeyManagerFaktory funguje obdobne ako TrustManagerFacory

X509TrustManager, X509KeyManager

Štandardne je používaná komunikácia na báze X.509 protokolu, tieto dve rozhrania musia byť implementované všetkými triedami, ktoré chcú daný štandard používať

class MyX509TrustManager implements X509TrustManager { X509TrustManager sunX509TrustManager; MyX509TrustManager() { sunX509TrustManager = tmf.getTrustManagers()[0] } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException) { try { sunX509TrustManager.checkServerTrusted(chain, authType); } catch (CertificateException excep) { } public X509Certificate[] getAcceptedIssuers() { return sunJSSETrustManager.getAcceptedIssuers(); }}

HostnameVerifier

Rozhranie slúži na určenie činnosti, ktorá sa má uskutočniť, ak štandardné autentifikačné metódy zlyhajú

public class MyHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { // pop up an interactive dialog box // or insert additional matching logic if (good_address) { return true; } else { return false; } }}HttpsURLConnection urlc = (HttpsURLConnection) (new URL("https://www.sun.com/")).openConnection();urlc.setHostnameVerifier(new MyHostnameVerifier());

[1] http://java.sun.com/j2se/1.4.2/docs/api/[2] http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html[3] http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html[4] http://java.sun.com/j2se/1.4.2/docs/guide/security/jce/JCERefGuide.html[5] http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html[6] http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASLMDevGuide.html[7] http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/index.html[8] http://java.sun.com/j2se/1.4.2/docs/guide/security/PolicyFiles.html[9] http://java.sun.com/j2se/1.4.2/docs/guide/security/HowToImplAProvider.html[10] http://java.sun.com/j2se/1.4.2/docs/guide/security/doprivileged.html

Použité zdroje

Recommended