Java i PGP
PGP
Što je to PGP
PGP je jedan od najpopularnijih i najraširenijih
načina zaštite sadržaja elektronske pošte danas. Koristi se vrlo pouzdanim
kriptografskim algoritmima:
-
RSA za kriptiranje putem javnog ključa
i
-
IDEA za simetričnu kriptografiju putem
tajnog ključa.
Ima razrađen sistem deponiranja javnih i tajnih ključeva
u vlastite malene baze podataka te povrh svega pruža mogućnost kompresije
podataka. Može se koristiti za ciljano kriptiranje elektronske pošte jednom
ili više korisnika te za digitalni potpis elektronske pošte.
Konvencionalno kriptiranje putem
tajnog ključa
Kriptografija putem tajnog ključa još se naziva i
simetrična kriptografija. Kako je vidljivo sa slike dolje, kriptiranje
i dekriptiranje se vrši pomoću jednog ključa, tzv. tajnog ključa.
Ova vrsta kriptografije nije pogodna za razmjenu kriptiranih poruka između
dva entiteta, no nalazi svoju primjenu u zaštiti podataka jednog entiteta
tj. kad nema potrebe za prijenosom informacije koja sadrži tajni ključ.
Slika 1: Konvencionalna kriptografija putem tajnog
ključa
Kriptiranje putem javnog ključa
U svrhu kriptiranje komunikacije između dva ili više entiteta
koristi se kriptografija putem javnog ključa. Za ovu je kriptografiju
karakteristično da barata parom ključeva: jednim tajnim te jednim
javnim ključem. Da bi entitet
A
poslao zaštićenu poruku entitetu
B
on mora posjedovati njegov javni ključ i
svoj tajni ključ. Kriptiranu poruku tada može pročitati samo entitet
B
ako posjeduje pripadajući tajni ključ.
Slika 2: Kriptografija putem javnog ključa
PGP
algoritam koristi principe jednog i drugog algoritma, međusobno ih kombinira
kako bi na što efikasniji i brži način obavio vremenski zahtjevne poslove
kriptiranja.
PGP način kriptiranja
Kao je ilustrirano na slici dolje,
PGP
zapravo koristi metodu tajnog ključa za kriptiranje
sadržaja poruke. To je tako urađeno iz jednostavnog razloga jer je algoritam
tajnog ključa daleko brži od algoritma javnog ključa uz gotovo
istu sigurnost. Samu kriptografiju javnog ključa upotrebljavamo
kako bismo pohranili informaciju o privremenom slučajnom (random generiranom)
tajnom ključu, tj. ulaznoj šifri simetričnog algoritma.
Slika 3: Na koji način PGP kriptira sadržaj
Primijetite da nam je za dekriptiranje sadržaja poruke
sada potreban tajni dio ključa kako bismo metodom javnog ključa
dobavili ulaznu šifru simetričnog algoritma i konačno dekriptirali
poruku.
Slika 4: Na koji način dekriptirati PGP-om
kriptiranu poruku
Ovakav način zaštite sadržaja poruke "iza dva ključa"
možda se čini slabijom implementacijom u odnosu na implementaciju koju
bi imali kad bi koristili samo jedan način kriptiranja (analogija paralelnog
spoja otpornika), međutim ovaj način po efektivnoj manifestaciji zadržava
osobine metode javnog ključa i brzinu metode tajnog ključa,
dakle poželjne osobine oba algoritma uz i dalje garantiranu priličnu sigurnost
poruke. Nije naodmet napomenuti da ni
IDEA
ni
RSA
algoritmi dosad nisu razbijeni isto kao ni
PGP-način
kriptiranja kombinacijom ova dva algoritma.
Također je važno napomenuti činjenicu koja nije ilustrirana
na slici, a radi se o primjeni
MD5
algoritma kojim se obavezno svaka poruka dodatno zaštićuje
bilo da se radi o kriptiranju putem tajnog ključa ili o
PGP-načinu kriptiranja.
MD5
algoritam ovdje služi istoj svrsi koju ima primjerice CRC-checksum
informacija unutar neke arhive, s razlikom da je CRC daleko brži ali
MD5
daleko pouzdaniji algoritam. Valja naglasiti da se u
MD5
informaciju obično ubacuje i vrijeme kada je checksum napravljen, jedna
stvar koja je CRC algoritmu potpuno nebitna.
Informacija
MD5
algoritma nam je daleko najvažnija prilikom
digitalnog potpisivanja nekog sadržaja.
Digitalni potpis
Danas nažalost još uvijek vlada širom svijeta mišljenje naslijeđeno
iz starijih vremena kada je kriptografija bila još u povojima ili šablonski
urađenih špijunskih filmova gdje okretni superheroji poput James Bonda
rješavaju najkompliciranije kriptografske mozgolomke dječjim slagalicama.
Istina je, dakako, vrlo daleko od toga:
"If all the personal computers in the world - 260 milion - were
put to work on a single PGP-encrypted message, it would still take an estimated
12 milion times the age of the universe, on average, to break a single
message."
William Cromwell, Deputy Director of National Security Agency, March
20. 1997.
"Ako bi sva računala svijeta - njih 260 miliona - bila pokrenuta
u zajedničkom zadatku na jednoj jedinoj PGP-om zaštićenoj poruci, bilo
bi potrebno u prosijeku 12 miliona puta više vremena koliko je proteklo
od nastanka svemira da bi je uspijeli probiti."
William Cromwell, Zamjenik direktora NSA, SAD 20. ožujka 1997.
[pgp50manual.pdf:118]
Inače upućeni govore da je
NSA
poznata po kriptografskom prisluškivanju
te kao organizacija koja uvjerljivo prednjači po broju uposlenih kriptoanalitičara
(mnogi je nazivaju kriptografskom CIA-om). Sve u svemu, zamjeniku
direktora ovakve jedne organizacije svakako je za vjerovati.
No, vratimo se našoj analizi. Cilj ovog citata je bio
da se ukaže na pouzdanost digitalnog potpisa koji je, nažalost,
još vrlo daleko od ravnopravnosti prema potpisu rukom ili čak rukom potpisanim
pa putem faxa poslanog dokumenta.
Digitalno potpisivanje čiji je prikaz dat na slici
5 je identičan postupak u gotovo svakoj implementaciji metode javnog
ključa. Napravi se nekim od checksum algoritama (u konkretnom
slučaju PGP
-a
to je MD5
) kontrolna vrijednost koja jednoznačno opisuje
sadržaj. Tada tu poruku kriptiramo putem tajnog dijela ključa metode
javnog ključa
(RSA
secret key) na taj način svojim digitalnim
potpisom (manifestiranim upisivanjem šifre potrebne za dobavljanje
tajnog dijela ključa) garantiramo izvornost sadržaja (manifestirana jednoznačnim
MD5
checksumom).
Slika 5: Kreiranje digitalnog potpisa
Pogledajmo sada na koji se način provjerava autentičnost
digitalnog potpisa.
Slika 6: Provjera autentičnosti digitalnog
potpisa
Potrebno je konstruirati
MD5
"destilat" poruke koji naknadno uspoređujemo sa izlazom dobivenim
"dekriptiranjem" digitalnog potpisa koristeći javni dio ključa
korisnika.
PGP u Javi
Na koji način
Mora se priznati da implementirati
PGP
u
Javi
i nije najpogodnije rješenje iz dva razloga:
-
Java
je previše spora pri izvršavanju kôda tako da bi zahtjevne operacije kriptiranja
i dekriptiranja bile neoprostivo spore i
-
sam
PGP
je prenesen na jednak, ako ne i veći broj platformi i operativnih sistema od
Jave
tako da se tu gubi
Javin
obično vrlo jak argument prenosivosti izvršnog koda.
Ostaje nam ipak srednje, alternativno rješenje: iskodirati
zahtjevne kripto-funkcije u obliku
Javinog
native kôda. Na taj
način ipak radimo u
Java
programskom jeziku dok se kripto-funkcije izvršavaju tek nešto sporije nego što
bi se izvršavale kao native
C-funkcije
u izvršnom kodu
C-programa.
Loša strana native-rješenja je da smo njegovom upotrebom
odustali od apsolutne prenosivosti koju garantira
Java.
No u krajnjoj liniji to i nije tako strašno jer dotične kripto-funkcije
koristimo na relativno statičnoj strani poslužioca dok se za kriptiranje
sadržaja poruka na strani korisnika mora pobrinuti neki drugi program.
Zašto ne PGP u appletu?
Zahtjeve korisnika obrađujemo putem
Java
appleta koji se izvršava na nekom
od Internet pretraživača koji podržavaju
Javu,
kao što su Netscape, Internet Explorer, HotJava ili
appletviewer.
Primijetite da se ovdje radi o
Java
appletu, a ne o
Javinoj
aplikaciji, tako da
se mora voditi računa o svim ograničenjima koje imaju appleti naspram
aplikacija. Od prije navedenih ograničenja ovdje nam upotrebu
PGP-a
priječe sljedeća dva razloga:
-
appleti ne mogu pokretati vanjske programe - tako
da otpada automatska upotreba
PGP
vanjskog programa i
-
appleti ne mogu koristiti native library
datoteke.
Čak i ako bismo doskočili ovim problemima iskodiravši do-zla-boga-spor-applet
koji ne koristi native implementaciju kripto-funkcija već je apsolutno
cijeli pisan u
Javi,
ne možemo zaobići sljedeću zapreku:
-
appleti ne mogu dohvaćati datoteke sa lokalnog
čvrstog diska niti pohranjivati podatke u iste.
Jedina moguća varijanta koja nam ostaje je koristiti applet
apsolutno cijeli pisan u
Javi
koji će dohvaćati javne i tajne ključeve sa Interneta,
no to tek nema smisla jer bi informacija o tajnom ključu nezaštićeno kolala
Internetom, a ovdje pokušavamo ostvariti nekakvu sigurnost komunikacije.
Napomena:
-
Gore navedene informacije nisu u potpunosti korektne jer se odnose na stariju
verziju Jave
(JDK v1.02). U novijoj verziji
Jave
je podržano ograničeno zaobilaženje
striktno utvrđenih restrikcija appleta putem digitalno potpisanih
JAR
datoteka (dotična mogućnost je trenutno podržana samo u Internet pretraživaču
Netscape v4.0 naviše), te digitalno potpisanih
CAB
datoteka (podržanih samo u Internet pretraživaču Microsoft Internet Explorer
v4.0 naviše).
PGP Java poslužioc
Način rada
PGP Java poslužioc
(server) je izrađen u tzv. Multy-Threaded izvedbi. Proučimo
sljedeću sliku:
Slika 7: Multy-Threaded struktura poslužioca
Sa slike možemo zaključiti da je poslužioc u stanju obrađivati
zahtjeve više od jednog korisnika istovremeno. Takav način obrade je u
Javi jedino
moguće ostvariti putem tzv. threadova odnosno odvajanjem zasebnih
procesa obrade od glavnog procesa (po manifestaciji slično kao fork()
funkcija u C-u).
U suprotnom imali bismo zastoj jer bi bilo moguće vršiti obradu zahtijeva
samo jednog procesa istovremeno. Ovakav pristup korištenja zasebnih procesa
za određene radnje poznatiji je pod imenom multy-thread način. Također
na slici možemo uočiti manje kućice u kojima piše session. To je
uobičajen naziv za nezavisan proces obrade.
Što se konkretno tu zbiva. Pokretanjem PGPserver
procesa otvara se novi servis na portu (Internet
ulazu) broj 4444. Proces PGPserver
čeka da ga neki drugi proces kontaktira te zatraži
obradu (MasterSocket blokiran u proceduri accept()). Kad
se to napokon i dogodi, PGPserver
proces pokreće zaseban thread proces
kojem prosljeđuje kao argumente parametre Internet veze (socket)
procesa koji zahtijeva obradu. Thread proces preuzima daljnju obradu
od PGPserver procesa koji tako postaje
slobodan za ponovno prihvaćanje novog poziva. U ovoj konkretnoj izvedbi
thread proces služi samo kao filtar između klijenta (tj. korisnika)
i radnih rutina klase PGPradnik
analizirajući
prirodu pojedinog zahtjeva te u slučaju da je potreban dodatni argument
čeka na njegov unos kako bi osigurao ispravnu obradu zahtjeva.
Podržane mogućnosti
Pogledajmo mogućnosti cijelog
PGP-Server
a:
-
moguće je "jednokratno" pokretanje (predviđeno za testiranje)
radnih rutina bez pokretanja cijelog poslužioca, te unošenje zahtijeva
obrade putem komandne linije
-
multy-threaded način obrade zahtijeva
-
podrška za identifikaciju putem ident odnosno auth
servisa (servis na internet portu broj 113)
-
podrška za naknadno obavještavanje korisnika o rezultatima
dekriptiranja poruke putem elektronske pošte
-
CGI/Telnet kompatibilnost
unosa zahtijeva (sve zahtjeve moguće je ručno ukucati putem direktne
Telnet ili posredne CGI veze)
-
podrška za PGP
KeyServer (servis namijenjen razmijeni javnih
PGP ključeva)
-
podrška za pamćenje korištenih PGP
javnih ključeva (key-caching)
-
SSL kompatibilna
podrška
-
podržava sljedeće komande:
-
HELP
-
prikazuje upute o mogućim komandama
-
PLAIN
-
prikazuje "običnu", neprivilegiranu informaciju
-
SIGN
-
prikazuje neprivilegiranu informaciju s tom razlikom da je
digitalno potpisana od strane poslužioca
-
ENCRYPT
-
prikazuje privilegiranu kriptiranu poruku za predefiniranog
korisnika
-
iENCRYPT
-
prikazuje privilegiranu kriptiranu poruku za niz proizvoljnih
korisnika
-
poslužioc očekuje nakon unosa komande niz korisnika koje
unosimo uzastopno jednog za drugim
-
prazne linije se ignoriraju a unošenje završavamo kada unesemo
samo točku u cijeloj liniji
-
SIEN
-
prikazuje privilegiranu potpisanu i kriptiranu poruku za
predefiniranog korisnika
-
iSIEN
-
prikazuje privilegiranu potpisanu i kriptiranu poruku za
niz proizvoljnih korisnika
-
poslužioc očekuje nakon unosa komande niz korisnika koje
unosimo uzastopno jednog za drugim
-
prazne linije se ignoriraju a unošenje završavamo kada unesemo
samo točku u cijeloj liniji
-
LIST
-
prikazuje sadržaj lokalne baze javnih ključeva
-
DECRYPT
-
pokušava dekriptirati poruku ili provjeriti digitalni potpis,
te ako je poruka potpisana i potpisnik na listi privilegiranih korisnika,
pokušava interpretirati dekriptiranu poruku kao niz komandi poslužiocu;
privilegije pojedinih korisnika kontroliramo putem inicijalizacijkse datoteke
-
nakon unošenja ove komande poslužioc očekuje kriptiranu ili
potpisanu poruku; sve unesene linije izvan definiranog
PGP
omotača poruke koji je omeđen linijama
"----- BEGIN PGP"
i
"----- END PGP>" se ignoriraju
-
ukoliko unesemo više kriptiranih poruka uzastopce, tada
će samo prva biti obrađena, dok će ostale biti ignorirane
-
unošenje završavamo kada unesemo samo točku u cijeloj
liniji
-
DEBUG
-
pokreće odnosno gasi
DEBUG
način rada predviđen za otkrivanje grešaka (puno
više ispisanih informacija o funkcijama te kroz koje program prolazi, te
ulaznim parametrima samih funkcija)
-
INIT
-
nanovo inicijalizira samog sebe
-
korisna je prilikom dinamičkog mijenjanja parametara
putem inicijalizacijkse datoteke (manifestacija slična
UNIX
naredbi kill -HUP 1)
-
WHOIS <?>
-
dobavlja KeyID/UserID informacije
PGP
javnih ključeva
-
ako se informacija korisnika nalazi u memoriji (cache-u),
tada se dohvaća bez daljnje provjere iz memorije
-
ukoliko je poslužioc konfiguriran tako da koristi
KeyServer,
tada se informacija o pojedinom korisniku traži
prvo po lokalnoj bazi javnih ključeva pa tek tada putem
PGP KeyServera
-
naredba zahtijeva unos korisnika odmah iza nje same
-
podržani oblici unosa: "0x36329519" za
pretraživanje putem KeyID informacije ili "Zoran Rajic <zox@imagine.cc.fer.hr>"
za pretraživanje putem UserID informacije
-
dohvaćeni javni ključevi ostaju u memoriji programa (automatsko
cachiranje)
-
CACHE
-
prikazuje sadržaj trenutno pohranjenih ključeva u memoriji
programa
-
CLEAR
-
briše sadržaj svih ključeva pohranjenih u memoriji programa
-
UP
-
prikazuje informaciju o statusu poslužioca
-
IAIK
-
PRIVREMENA KOMANDA (nije dokumentirana unutar
standardnog prikaza
HELP
komande)
-
pokreće SSL poslužioc
(normalno privilegirana komanda, tj. dostupna samo određenim korisnicima
putem PGP
kriptirane ili potpisane komande)
-
DIE
-
PRIVREMENA KOMANDA (nije dokumentirana unutar
standardnog prikaza
HELP
komande)
-
završava rad poslužioca (server shutdown; normalno
privilegirana komanda, tj. dostupna samo određenim korisnicima putem
PGP kriptirane
ili potpisane komande)
-
KILL
-
PRIVREMENA KOMANDA (nije dokumentirana unutar
standardnog prikaza
HELP
komande)
-
"nasilno" završava rad poslužioca zatvarajući njegov Internet
ulaz (MasterSocket.close(); normalno privilegirana komanda,
tj. dostupna samo određenim korisnicima putem PGP
kriptirane ili potpisane komande)
-
BYE
-
završava sa radom (quit session)
Konfiguriranje poslužioca
Svi potrebni parametri koncentrirani su u jednu inicijalizacijsku
datoteku. Pogledajmo koje sve parametre putem te datoteke možemo mijenjati:
C:\Java\src\dipl\PGP\Server> type prefs.ini
[KeyRings]
#SecretKeyRing = /home/zox/stuff/java/Web/secring.pgp /home/zox/.pgp/secring.pgp
SecretKeyRing = C:\Java\src\dipl\PGP\Server\secring.pgp
PublicKeyRing = C:\Java\src\dipl\PGP\Server\pubring.pgp
[General]
#MyName = Zoran Rajic <zox@imagine.cc.fer.hr>
MyName = PGP Java testing...
[Server]
Port = 4444
#Timeout = 1800
Auth = YES
AuthTMOUT = 5
MailBack = NO
SignatureValidTime = 3600
[Client]
#Timeout = 120
[IAIK-SSL]
CERT_SERVER = C:\Java\src\dipl\PGP\certs\serverCert1024.der
CERT_CA = C:\Java\src\dipl\PGP\certs\caCert1024.der
RSA_PKEY = C:\Java\src\dipl\PGP\certs\serverPrivateKey.der
RSA_PKEYtemp = C:\Java\src\dipl\PGP\certs\tempPrivateKey.der
Timeout = 120
[Secure]
Kamera = << _EOL_Kamera_list
1C0401C216FC4CB5:Josko Orsulic <josko.orsulic@fer.hr>
EFBFEF98D8DC3805:Zoran Rajic (zox) <zoran.rajic@fer.hr>
9F9B08EB36329519:Zoran Rajic <zox@imagine.cc.fer.hr>
CD2AB42F98F82FAD:PGP Java testing...
FCC34FAC95ED61A1:Mario Zagar <mario.zagar@fer.hr>
_EOL_Kamera_list
Server.down = << _EOL_Server_down
EFBFEF98D8DC3805:Zoran Rajic (zox) <zoran.rajic@fer.hr>
9F9B08EB36329519:Zoran Rajic <zox@imagine.cc.fer.hr>
_EOL_Server_down
SSLServer = << _EOL_SSLServer
EFBFEF98D8DC3805:Zoran Rajic (zox) <zoran.rajic@fer.hr>
9F9B08EB36329519:Zoran Rajic <zox@imagine.cc.fer.hr>
CD2AB42F98F82FAD:PGP Java testing...
FCC34FAC95ED61A1:Mario Zagar <mario.zagar@fer.hr>
_EOL_SSLServer
[EXE]
Kamera = kamera.controll.move
Server.down = server.suicide
SSLServer = SSLServer
[WebClient]
Server = pgp.rasip.fer.hr
Port = 80
Path = /cgi-bin/extract-key
CGIpath = ?op=get&search=
Pogledajmo pobliže što sve možemo kontrolirati putem dotične
datoteke:
-
KeyRings - putanja do baza podataka javnih i tajnih ključeva
-
SecretKeyRing
-
specificira putanje do baza podataka tajnih ključeva
-
podržano je korištenje više baza podataka tajnih ključeva
-
PublicKeyRing
-
specificira putanje do baza podataka javnih ključeva
-
podržano je korištenje više baza podataka javnih ključeva
-
General - postavljanje generalnih informacija
-
MyName
-
OBAVEZAN PARAMETAR
-
informacija o UserID-u poslužioca
-
potrebna kako bi poslužioc "znao" koji je njegov identifikator
javnog ključa kako bi mogao kriptirati i dekriptirati poruke
-
Server - postavljanje parametara vezanih direktno uz program
poslužioc
-
Port
-
informacija koji će port (internet ulaz) program poslužioc
koristiti za uspostavljanje svojeg servisa
-
Timeout
-
govori koliko vremena želimo da poslužioc čeka na dolazak
zahtijeva za obradu
-
nakon isteka tog vremena automatski se generira java.io.InterruptedException
iznimka pri čijoj obradi zatvaramo servis
-
primjerice, ukoliko je vrijednost ovog parametra 1800
tada će se generirati Interrupted
iznimka samo ako između dva zahtijeva za
obradom poslužioc čeka dulje od 1800 sekundi (pola sata)
-
ukoliko je vrijednost 0 (predefinirana vrijednost)
poslužioc će raditi do vanjskog prekida ili eksplicitnog zahtijeva privilegiranog
korisnika za prestankom rada
-
Auth
-
ovim parametrom definiramo želimo li provjeravati identitet
dolazećih korisnika putem ident tj. auth servisa
-
važno je za napomenuti da ukoliko koristimo ovu opciju
obavezno postavimo i parametar AuthTMOUT jer se u protivnom može
desiti da korisnik čeka unedogled na obradu svojih zahtijeva (u slučaju
neispravnog ili prezagušenog identifikacijskog servisa na korisnikovom
računalu)
-
više o identifikacijskim servisima možete naći u dokumentima
RFC 931 i
1413
-
AuthTMOUT
-
definiramo koliko vremena želimo čekati na potvrdu informacije
o identitetu korisnika
-
ukoliko nije navedena Auth opcija, ova vrijednost
se ignorira
-
MailBack
-
definiramo želimo li da poslužioc šalje dodatne izvještaje
o rezultatima dekriptiranja poruke
-
eventualni izvještaj se šalje putem elektronske pošte i to
ako je moguće na internet adresu pribavljenu putem identifikacijskog servisa
(pogledati Auth opciju), te u protivnom na internet adresu definiranu
unutar UserID informacije pribavljene iz javnog ključa korištenog
pri dekriptiranju poruke
-
ukoliko je dekriptirana kriptirana poruka, tada se
elektronska pošta šalje također kriptirana za specifičnog korisnika te
ako je poruka bila potpisana tada kao povratnu informaciju poslužioc
šalje potpisan izvještaj
-
SignatureValidTime
-
ovim parametrom definiramo koliko će vremena (u sekundama)
potpisana poruka biti valjana od trenutka kada je napravljen digitalni
potpis
-
za utvrđivanje valjanosti poruke koristi se informacija dobavljena
iz MD5 signature
poruke tako da ne postoji način zaobilaženja restrikcije postavljene ovom
opcijom
-
ukoliko je vrijednost 0, tada neće biti kontrole valjanosti
poruke
-
Client - postavljanje parametara vezanih direktno uz korisnike
servisa
-
Timeout
-
postavljamo koliko vremena (u sekundama) neaktivnosti sessiona
smije proteći do automatskog zatvaranja veze
-
primjerice, ukoliko postavimo vrijednost od 120, tada
će se veza prema korisniku nasilno zatvoriti (disconnect) ukoliko
prođe 2 minute neaktivnosti u komunikaciji između poslužitelja i
korisnika
-
ukoliko je vrijednost 0, tada se neće kontrolirati
vrijeme neaktivnosti
-
IAIK-SSL - postavljanje parametara o stazama certifikata
-
CERT_SERVER
-
postavljanje staze gdje se nalazi certifikat SSL-poslužioca
-
CERT_CA
-
postavljanje staze gdje se nalazi CA
certifikat SSL-poslužioca
-
RSA_PKEY
-
postavljanje staze gdje se nalazi RSA
privatni ključ SSL-poslužioca
-
RSA_PKEYtemp
-
postavljanje staze gdje se nalazi privremeni RSA
privatni ključ SSL-poslužioca
-
Timeout
-
postavljanje koliko vremena (u sekundama) neaktivnosti SSL-poslužioca
smije proteći do automatskog zatvaranja servisa
-
Secure - definiranje privilegiranih korisnika za pojedine
specijalne servise
-
EXE - definiranje stvarnih komandi koje reprezentiraju specijalni
servisi
-
WebClient - definiranje parametara KeyServer
servisa
-
Server
-
postavlja ime poslužioca javnih ključeva
-
Port
-
postavlja vrijednost internet ulaza servisa (obično je port
80)
-
Path
-
postavlja stazu do konkretne komande namijenjene za dobavljanje
ključeva
-
CGIpath
-
postavlja opcionalne parametre komandi za dobavljanje ključeva
Primjer rada
Pretpostavimo da korisnik želi privilegiranu informaciju
i ne želi da se itko drugi domogne te informacije, pa makar prisluškivao
informacijski promet tim dijelom mreže. Naravno da sljedeći primjer radi
samo ukoliko je korisnik prijavljen za specijalni servis tj. da je naveden
u privilegiranoj listi korisnika unutar inicijalizacijske datoteke samog
poslužioca. Pretpostavimo dalje da korisnik želi povratnu informaciju u
čitljivom ili možda grafičkom obliku, a ne kao kriptiranu informaciju.
Razmotrimo na sljedećoj slici kako to shematski izgleda:
Slika 8: Shematski prikaz obrade specijalnog zahtjeva
Korisnik na svojem računalu formira zahtjev, kriptira
ga i potpisuje putem
PGP-a
te koristeći applet korisničko sučelje
ostvari TCP/IP vezu
sa poslužiocem i pošalje svoj zahtjev.
Na drugoj strani prilikom realizacije veze poslužioc kontaktira
identifikacijski servis korisničkog računala, te pribavlja informaciju
o adresi elektronske pošte korisnika. Dalje prepušta obradu zahtjeva thread-procesu
kako bi mogao dalje primati zahtjeve za obradom. Primijetite da se daljnja
obrada izvršava unutar thread-procesa posve neovisnog o osnovnom
toku obrade poslužioca te unutar zasebnog i izoliranog sessiona,
tj. okoline obrade.
Nakon toga thread-proces dekriptira poruku, primjećuje
da je potpisana, pregledava internu listu privilegiranih korisnika te pronalazi
potpisnika u toj listi. Zatim ukoliko sama poruka prođe vremensku provjeru
(da poruka nije previše stara) thread-proces specijalnom
procedurom krene interpretirati sadržaj poruke uz provjeru svake pojedine
komande navedene unutar poruke, točnije ima li privilegirani korisnik ovlaštenje
izvršiti dotičnu komandu.
Po završenim provjerama thread-proces tada po nalogu
korisnika radi dvije stvari:
-
pokreće novi thread-proces koji se pobrine za slanje
izvještaja putem elektronske pošte (sam izvještaj je samo potpisan ukoliko
je zahtjev stigao potpisan ili kriptiran i potpisan ukoliko je zahtjev
bio potpisan i kriptiran)
-
pokreće novi thread-proces unutar kojeg se otvara
novi servis sigurne komunikacije ostvarene putem SSL/HTTP
protokola (trenutna implementacija SSL-poslužioca
ne podržava provjeru identiteta korisnika putem SSL-korisničkih
certifikata, no daljnja razrada ove implementacije bi to svakako trebala
podržavati)
Korisničko sučelje
Java applet
Korisničko sučelje ostvareno putem Java
appleta je kompatibilno
sa JDK v1.0 programskim
paketom što znači da ga podržavaju svi Java
v1.0 kompatibilni internet pretražioci kao
što su:
-
Netscape, v3.0 naviše
-
MS Internet Explorer, v3.0 naviše
-
HotJava
-
appletviewer, dio JDK
v1.02 naviše
Razmotrimo kako izgleda korisničko sučelje:
Slika 9: Korisničko sučelje putem appleta
Kao što možemo primijetiti, korisničko sučelje je vrlo
jednostavno za upotrebu i nema mnogo opcija. Razlog tome su uvelike prije
navedena ograničenja koje sigurnosne norme nameću appletima. Nadalje,
kako bi zadržali kompatibilnost za starijim verzijama pretražioca korisničko
sučelje ne koristi nove mogućnosti koje pruža novija verzija Jave
(JDK v1.1) kao što su JavaBeansi,
pristup privremenom spremniku (clipboard)
ili zaobilaženje striktnih ograničenja appleta putem potpisanih
JAR arhiva.
Središnji dio prostora appleta zauzima tekstualni
prozor koji ima dvostruku namjenu. Primarna je da se putem njega prikazuju
rezultati zahtjeva obrade, tj. povratne informacije pribavljene od poslužioca.
Sekundarne namjene postajemo svjesni kada mišem pritisnemo "Edit
PGP msg"
tipku. Tada tekstualni prozor mijenja sadržaj
prikazanih poruka te boju pozadine u bijelo. Također se mijenja tekst unutar
"Edit..."
i "Send
PGP msg" tipki u "Clear
PGP msg"
i "Exit
editing PGP msg". Ovaj
drugi režim rada tekstualnog prozora namijenjen je unošenju PGP
poruke. Pritiskom na tipku "Clear
PGP msg" brišemo sadržaj
prozora kao i same PGP poruke, dok
pritiskom na "Exit editing
PGP msg" prelazimo u
normalan način gdje se tekstualni prozor onemogućava za unošenje poruka,
mijenja se pozadina u sivo, vraća prijašnji sadržaj te se na kraju mijenjaju
tekstovi tipki u početne ("Edit.." i "Send PGP msg"). Pritiskom na "Send
PGP msg" tipku šaljemo
unesenu PGP poruku
na obradu poslužiocu.
Napomena:
-
Applet nema mogućnost kriptiranja i potpisivanja PGP
poruka već se to obavlja vanjskim PGP
programom te se tako potpisana i/ili kriptirana
poruka unosi u za to namijenjen prostor unutar korisničkog sučelja.
Što ako poslužioc ne radi?
Što se dešava ako putem appleta pokušavamo ostvariti
TCP/IP
vezu prema poslužiocu u slučaju da poslužioc ne radi? Problem nije trivijalan
međutim ipak ga je moguće riješiti na nekoliko načina:
-
pokretanje poslužioca putem nezavisnog
HTTP/CGI
servisa,
-
konstruiranjem poslužioca po principima standardnih
BSD daemon
programa poslužioca što nam otvara
mogućnost automatskog pokretanja poslužioca putem inetd temeljnog
servisa (standardno rješenje na UNIX
platformama),
-
osiguravanje servisa poslužioca putem frekventne provjere
da li program poslužioc još uvijek radi (ostvarivo putem CRON
servisa na UNIX
platformama ili raznim schedule programima
na drugim platformama) ili
-
uspostavljanje servisa baziranog na Java
Virtualnoj Mašini (JVM) koji se služi
dinamičkim ubacivanjem Java-objekata
u listu aktivnih procesa manifestiranih poljem aktivnih klasa-spremnika.
U našoj realizaciji koristi se prvi način (HTTP/CGI)
tako da ukoliko se applet ne može povezati
s poslužiocem pokažemo alternativno korisničko sučelje:
Slika 10: Alternativno korisničko sučelje u slučaju
da poslužioc ne radi
Kako vidimo na slici, prva tipka sa tekstom "KICK
HIM" služi za podizanje poslužioca.
To naknadno pokretanje poslužioca se vrši na taj način da pretražioc automatski
pritiskom mišem na dotičnu tipku kontaktira specifičnu internet adresu
pokrećući na taj način HTTP/CGI
servis koji se pobrine da poslužioc proradi.
-
Napomena:
-
Applet može komunicirati sa internet pretražiocima poput Netscapea
ili Explorera i nalagati im da prikažu sadržaj neke
http://... adrese. Međutim
to nije slučaj sa programom appletviewer (dio JDK
paketa) kojim možemo pokazivati applete međutim
ne i druge internet dokumente. Dotičan program takve naloge appleta
jednostavno ignorira.
Razmotrimo i druga nabrojena rješenja:
-
BSD inetd rješenje: zahtijevalo bi specifičan
način otvaranja servisa poslužioca čija bi izvedba, doduše, bila dosta
jednostavnija na UNIX platformama,
međutim isto tako neizvediva na platformama koje ne koriste takvu strukturu
pokretanja servisa (inetd MasterDaemon)
-
CRON rješenje: mada je dosta pouzdano i zahvalno
te svakako preporučljivo kao popratno rješenje, dakle uz
recimo HTTP/CGI, ako bi se oslonili
samo na dotično rješenje bili bi prisiljeni prilično frekventno pregledavati
da li servis još uvijek radi (u većini slučajeva bi radio) što bi prouzrokovalo
nepotrebno zauzimanje resursa računala.
-
JVM rješenje: iako se ovo rješenje čini egzotičnim
i vrlo apstraktnim (vjerujte, vrlo je apstraktno) predstavlja
još ponajbolje rješenje pogotovo ukoliko na računalu želite imati par sličnih
Java-baziranih servisa. Sama ideja
se ne razlikuje od ideje BSD inetd rješenja
bez obzira na čudnovatu izvedbu putem klasa-spremnika. Ovom i sličnim metodama
se trenutno eksperimentira na RASIP zavodu
FER-a tako da
će vjerojatno vrlo brzo biti publicirana konkretna realizacija.