Upload
chaeli
View
70
Download
0
Embed Size (px)
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