2005 01 Pyro i OpenSSL–bezpieczny komunikator internetowy [Programowanie]


dla programistów
Pyro i OpenSSL
 bezpieczny
komunikator internetowy
Marek Sawerwain
dy planujemy przesyłać isto- opisu interfejsu pochodzących z progra-
tne informacje poprzez Inter- mu Glade.
net, to wprowadzenie szy- Do poprawnego działania będzie
Gfrowania danych w naszym wymagał, tak jak poprzednio, dwóch uru-
aplikacjach rozproszonych jest bardzo chomionych usług Pyro: serwera nazw
ważnym zagadnieniem. Istnieje wiele (usługę uruchamiamy poprzez wydanie
bibliotek wspomagających nas w tym polecenia ns) oraz serwera zdarzeń (usługę
temacie. Jedną z najbardziej znanych jest należy uruchomić wydając polecenie es).
OpenSSL. Jest ona dostępna we wszyst- Warto przedstawić sposób działa-
kich większych dystrybucjach Linuk- nia naszej aplikacji w postaci schema-
sa. Odpowiada za realizację bezpiecz- tu, który znajduje się na Rysunku 1. Jak
nych kanałów komunikacyjnych w opar- widać, mamy trzy specjalne serwery. Ser-
ciu o protokół SSL i jest wykorzystywana wery zdarzeń i nazw należą do systemu
przez wiele programów, w tym przeglą- Pyro, ale główny serwer, nazwany ser-
darki WWW. werem rozmów, musimy napisać samo-
Zastosowanie biblioteki OpenSSL naj- dzielnie, a raczej poprawić kod, doda-
lepiej pokazać na przykładzie. W nume- jąc obsługę SSL, bo przecież serwer już
rze Linux+ 10/2003 prezentowałem prosty wcześniej napisaliśmy.
komunikator na wzór bardzo popularne-
go Gadu-Gadu. Jedną z niedoskonało- Typowy serwer Pyro
ści tamtego programu była komunikacja Program komunikatora to wbrew pozo-
bez jakiegokolwiek szyfrowania danych. rom niewielka aplikacja. Aączny kod zró-
W tym artykule postaram się pokazać, dłowy serwera i klienta to tylko 7 kB
jak małym kosztem zmienić ten stan tekstu zródłowego w Pythonie. Zanim
rzeczy. wprowadzimy obsługę SSL do komunika-
tora, chciałbym przedstawić typową apli-
Kilka postanowień kację Pyro.
na początek Listing 1 zawiera kod klasy o nazwie
Najważniejszym zadaniem będzie doda- test_obj. Poprzez Pyro chcemy udostęp-
nie do komunikatora obsługi szyfrowa- nić tę klasę w sieci tak, aby inny użyt-
nego kanału. Uprzedzając dalszą część kownicy Pythona mogli ją wykorzy-
Na płycie CD/DVD
artykułu, już teraz mogę zdradzić, iż jest stać we własnych programach. Pierwszą
Na płycie CD/DVD znajdują się
to zadanie łatwe do wykonania. Głównie czynnością jest definicja klasy (Listing 1),
wykorzystywane biblioteki, kod
dlatego, iż Pyro znakomicie współpracu- którą zapisujemy w oddzielnym pliku
zródłowy programu oraz wszyst-
kie listingi z artykułu. je z biblioteką OpenSSL. o nazwie test_obj.py.
Aby w naszym komunikatorze znala- Istnieje kilka sposobów na napisanie
O autorze
zła się obsługa SSL, wymagana jest jesz- serwera. Poniżej zaprezentuję sposób, który
Autor zajmuje się tworzeniem
cze instalacja jednego pakietu o nazwie został użyty w komunikatorze. Pierwszym
oprogramowania dla WIN32
M2Crypt. Kilka uwag na ten temat zawiera elementem w implementacji serwera jest
i Linuksa. Zainteresowania:
ramka Kompilacja i instalacja pakietów. dołączenie odpowiednich pakietów:
teoria języków programowania
Pozostałe założenia naszego progra-
oraz dobra literatura.
Kontakt z autorem: mu pozostają niezmienione. Nadal jest import Pyro.core
autorzy@lpmagazine.org to program napisany w Pythonie. Będzie import Pyro.naming
korzystał z biblioteki GTK+ oraz z plików import test_obj
70
styczeń 2005
dla programistów
python/pyro/ssl
Kompilacja oraz
instalacja pakietów
Nasza aplikacja to dość mały program.
Wielkość jest wynikiem zastosowania
kilku bibliotek, które pozwalają zaim-
plementować całkiem zgrabną apli-
kację minimalną ilością kodu. Z tego
powodu, aby nasz komunikator zadzia-
łał, potrzebny jest język programowa-
nia Python oraz pakiet OpenSSL. Sam
język, jak również bibliotekę, znajdzie-
my bez problemów w każdej dystrybucji
Linuksa. Autorzy biblioteki Pyro zale-
cają najnowszą wersję Pythona, naj-
lepiej 2.3.3, oraz wersję OpenSSL nie
starszą niż 0.9.7 (jeśli w dystrybucji jest
starsza wersja, to koniecznie trzeba
dokonać aktualizacji tego pakietu).
Biblioteki Pyro raczej nie znajdzie-
my, ale zanim przystąpimy do jej insta- Rysunek 1. Schemat działania komunikatora
lacji, należy zainstalować inną biblio-
tekę o nazwie M2Crypt. Będzie ona
obsługiwać połączenia szyfrowane Dwa pierwsze dotyczą Pyro, ale ostatni ma zainstalowanej sieci i jest dostępny tylko
SSL. Biblioteka M2Crypto ma również pakiet to nasza klasa, którą mamy zamiar adres lokalny 127.0.0.1.
swoje wymagania i do poprawnej kom- udostępnić. W tym celu w serwerze Następnym krokiem w implementa-
pilacji wymaga pakietu SWIG w wersji definiujemy specjalną klasę pośrednią cji serwera jest uzyskanie obiektu ser-
przynajmniej 1.3.21. Pakiet SWIG jest w następujący sposób: wera nazw:
oferowany przez niektóre dystrybucje,
S
ale gdy pojawi się konieczność jego class test_obj_class ns=Pyro.naming.NameServerLocator().getNS()
kompilacji, to dzięki skryptowi confi- (Pyro.core.ObjBase, test_obj.test_obj):
gure sprawdza się ona do trzech pole- def __init__(self): Ostatnim obiektem do utworzenia jest
ceń: Pyro.core.ObjBase.__init__(self) daemon:
# ./configure  prefix=/katalog Następnie uruchomiamy serwer metodą daemon=Pyro.core.Daemon()
# make initServer:
# make install Konieczną operacją jest podanie mu
Pyro.core.initServer() obiektu serwera nazw i to wykonujemy
Proces kompilacji oraz instalacji pakie- w następujący sposób:
tu M2Crypto (jak również Pyro) sprowa- W przeciwieństwie do wcześniejszego
dza się do dwóch poleceń: kodu serwera komunikatora, określa- daemon.useNameServer(ns)
my jeszcze kilka dodatkowych informa-
# python setup.py build cji. Na początku określamy ilość infor- Ostatnie czynności w serwerze polegają
# python setup.py install macji, które będą zapisywane do pliku na podłączeniu naszego obiektu. W pierw-
zdefiniowanego za pomocą następnej szym parametrze wykorzystujemy klasę
Pamiętajmy, aby wcześniej zainsta- linii: pomocniczą test_obj_class, a w drugim
lować wszystkie pakiety bezpośred- ciąg znaków reprezentujący nasz obiekt,
nio związane z interpreterem Pytho- Pyro.config.PYRO_TRACELEVEL=3 czyli test_obj. Na koniec możemy wywo-
na oraz pakiety związane z biblioteką Pyro.config.PYRO_LOGFILE='server_log' łać metodę requestLoop, co spowoduje
OpenSSL. uruchomienie serwera. Kod tych dwóch
Nasz komunikator wymaga jeszcze Pózniej określamy komputer, na którym czynności przedstawia się następująco:
jednej biblioteki do poprawnego działa- został uruchamiany serwer nazw:
nia, a mianowicie PyGTK+, gdyż wyko- uri=daemon.connect(test_obj_class(), "test_obj")
rzystujemy GTK+ oraz pakiet libgla- Pyro.config.PYRO_NS_HOSTNAME='localhost' daemon.requestLoop()
de. Wiele dystrybucji, np. Aurox, Man-
drakelinux czy Fedora Core, zawiera- Ustalenie adresu serwera nazw oraz serwe- Klient Pyro
ją odpowiednie pakiety  wystarczy je ra zdarzeń (Pyro.config.PYRO_ES_HOSTNAME) W programie klienta, podobnie jak w ser-
tylko doinstalować. jest szczególnie istotne, gdy będziemy testo- werze, na początek dołączamy potrzeb-
wać program na komputerze, na którym nie ne pakiety:
71
www.lpmagazine.org
dla programistów
import Pyro.util
Listing 1. Postać klasy test_obj
import Pyro.core
class test_obj:
Następnie inicjujemy klienta:
def m1(s, string):
print "Metoda m1 parametr:", string Pyro.core.initClient()
return "Długość ciągu znaków: "+str(len(string))
def m2(s, number): Pózniej ustalamy parametry pomocnicze,
print "Metoda m2 parametr:", number takie jak adres komputera, na którym
return "Kwadrat liczby:"+str(number*number) znajduje się serwer nazw.
Gdy to zrobimy, możemy uzyskać
referencję do zdalnego obiektu. Wyko-
rzystujemy metodę getProxyForURI:
Listing 2. Pełny kod serwera oparty o protokół SSL
S
test = Pyro.core.getProxyForURI
#! /usr/bin/env python ("PYRONAME://test_obj")
import sys Po tych czynnościach metody ze zdalne-
import Pyro.core go obiektu wywołujemy tak samo, jak
import Pyro.naming przy lokalnych obiektach:
import Pyro.util
import Pyro.protocol print test.m1("Abcdef")
print test.m2(5)
from Pyro.errors import PyroError,NamingError
from Pyro.protocol import getHostname Dodajemy obsługę SSL
do serwera
import test_obj Jak widać, napisanie nieskompliko-
wanego serwera i klienta przy zasto-
class test_obj_class(Pyro.core.ObjBase, test_obj.test_obj): sowaniu Pyro to dość łatwe zada-
def __init__(self): nie. Kod zródłowy biblioteki zawie-
Pyro.core.ObjBase.__init__(self) ra wiele przykładów, które polecam
przejrzeć czytelnikom, którzy w tym
class printCertValidator(Pyro.protocol.BasicSSLValidator): momencie zainteresowali się tą biblio-
def checkCertificate(self,cert): teką. Naszym głównym zadaniem jest
if cert is None: jednak komunikacja za pomocą proto-
return (0,3) kołu SSL.
print "Cert Subject: %s" % cert.get_subject() Listing 2 zawiera pełny kod serwera
return (1,0) udostępniającego obiekt test_obj przy
zastosowaniu protokołu SSL. Postać ser-
wera jest bardzo podobna do poprzed-
##### main program ##### niego przykładu, w którym komunika-
cja jest jawna.
Pyro.core.initServer() Pierwszą różnicą są pakiety, które
Pyro.config.PYRO_TRACELEVEL=3 dołączamy. Istotny jest Pyro.protocol,
Pyro.config.PYRO_NS_HOSTNAME='localhost' używany w klasie printCertValidator.
Pyro.config.PYRO_LOGFILE='server_log' Kolejna różnica kryje się w tworzeniu
obiektu daemon. W argumencie konstruk-
ns=Pyro.naming.NameServerLocator().getNS() tora podajemy wartość PYROSSL:
daemon=Pyro.core.Daemon(prtcol='PYROSSL') daemon=Pyro.core.Daemon(prtcol='PYROSSL')
daemon.setNewConnectionValidator(printCertValidator())
daemon.useNameServer(ns) W ten sposób nakazujemy stosowanie
protokołu SSL.
uri=daemon.connect( test_obj_class(), "test_obj") Następnie podłączamy klasę print-
CertValidator, której zadaniem jest
print "Server is ready. Let's go!!!" sprawdzenie poprawności certyfikatu:
daemon.requestLoop()
S
daemon.setNewConnectionValidator
(printCertValidator())
72
styczeń 2005
dla programistów
python/pyro/ssl
Kolejne czynności pozostają niezmie-
Listing 3. Postać plików z certyfikatami dla protokołu SSL
nione w porównaniu do zwykłego ser-
wera. Plik z głównym certyfikatem:
Zajmijmy się teraz klasą printCert- -----BEGIN CERTIFICATE-----
Validator. Zawiera ona jedną metodę MIIDkjCCAvugAwIBAgIBA i tak dalej ....
 checkCertificate. Musi ona zwrócić -----END CERTIFICATE-----
pewne określone wartości. Jeśli chcemy Plik client.pem:
zaakceptować certyfikat, to jako war- -----BEGIN CERTIFICATE-----
tość powrotną zwracamy parę (1,0). MIIDvzCCAyigAwIBAgIBATANBgkqh i tak dalej ....
W przypadku odrzucenia certyfikatu, -----END CERTIFICATE-----
za pomocą słowa return musimy -----BEGIN RSA PRIVATE KEY-----
przekazać parę (0, kod_błędu). Przez MIICXQIBAAKBgQC7ixGOs2Sq i tak dalej ...
kod_błędu rozumiemy jedną z poniż- -----END RSA PRIVATE KEY-----
szych wartości: Plik server.pem:
-----BEGIN CERTIFICATE-----
" Pyro.constants.DENIED_UNSPECIFIED MIIDvzCCAyigAwIBAgIBATANBgkqh i tak dalej ....
 dowolny powód błędu; -----END CERTIFICATE-----
" Pyro.constants.DENIED_SERVERTOOBUSY -----BEGIN RSA PRIVATE KEY-----
 serwer jest zbyt zajęty; MIICXQIBAAKBgQC7ixGOs2Sq i tak dalej ...
" Pyro.constants.DENIED_HOSTBLOCKED -----END RSA PRIVATE KEY-----
 blokada komputera;
" Pyro.constants.DENIED _ SECURITY
S
 błąd związany z bezpieczeństwem. Program klienta test1 = Pyro.core.getProxyForURI
W programie serwera najważniej- ("PYRONAME://test_obj")
Na Listingu 2, gdy nie ma certyfikatu, szą zmianą było dodanie w kon-
zwracamy parę (0,3), co oznacza błąd struktorze obiektu daemon informacji Jeśli jednak chcemy jawnie określić
związany z bezpieczeństwem. o tym, że będziemy korzystać z pro- komputer oraz fakt użycia przez nas pro-
Jak widzimy, dodanie obsługi SSL tokołu SSL. W kliencie nie musimy tokołu SSL, to możemy w wywołaniu
wymaga dołączenia jednej klasy oraz wykonywać żadnych zmian! Bibliote- metody getProxyForURI podać pełne
kosmetycznych zmian w kodzie. Oprócz ka Pyro samodzielnie wykryje fakt, że dane w następujący sposób:
serwera, musimy wygenerować certyfi- serwer korzysta z protokołu SSL i klient
katy dla serwera i klienta. Informacje o samoczynnie przełączy się na komu- test2 = Pyro.core.getProxyForURI
tym, jak tego dokonać, podam w dal- nikację poprzez SSL. Z tego powodu ("PYROLOCSSL://localhost/test_obj")
szej części artykułu. Teraz zajmiemy się uzyskanie referencji do obiektu nadal
klientem. możemy wykonywać w ten sposób: Ostatni składnik w adresie to nazwa obie-
ktu, którą podaliśmy w drugim argu-
mencie metody connect podczas rejestro-
wania naszej klasy w serwerze.
Jak widać, siłą Pyro jest automaty-
zacja wielu operacji. Istotne zmiany,
które należy wprowadzić, aby zwięk-
szyć bezpieczeństwo aplikacji Pyro,
wykonujemy tylko po stronie serwe-
ra. Uzbrojeni w tę wiedzę w bardzo
łatwy sposób możemy dokonać zmian
w naszym komunikatorze.
Generowanie certyfikatów
Bezpieczeństwo komunikacji ściśle zależy
od utworzonych certyfikatów. Z tego
powodu, zanim zaczniemy modyfiko-
wać nasz program, wygenerujemy sto-
sowne certyfikaty. Nie jest to trudne,
ale musimy znać obsługę programu
openssl. Możemy ułatwić sobie zada-
nie, jeśli będziemy korzystać ze skryp-
tu pomocniczego, dostępnego w kodzie
zródłowym pakietu OpenSSL. Potrzeb-
Rysunek 2. Nasza aplikacja podczas rozmowy
ny skrypt można odnalezć wtedy
73
www.lpmagazine.org
dla programistów
z pliku newcert.pem do pliku
o nazwie client.pem, a następnie dołą-
czamy do niego opis klucza prywatnego
z pliku newkey.pem.
Z certyfikatem przeznaczonym dla
serwera postępujemy w podobny
sposób, ale nie generujemy już cer-
tyfikatu autoryzacji (jest wspólny dla
klienta i serwera), lecz następny cer-
tyfikat żądania. Podczas wypełnia-
nia pól informacyjnych warto zwrócić
uwagę na to, aby pole Common Name
posiadało inną wartość dla klienta
i dla serwera.
Po zakończeniu operacji tworze-
nia plików client.pem oraz server.pem
brakuje nam jeszcze jednego pliku,
a mianowicie głównego certyfikatu. Znaj-
duje się on w katalogu demoCA pod nazwą
cacert. Wystarczy ten plik przekopiować do
katalogu, w którym znajdują się pozostałe
pliki naszej aplikacji. Zmieniamy nazwę pliku
Rysunek 3. Strona domowa PYRO
z certyfikatem na ca.pem oraz kasujemy
początkowe informacje o certyfikacie aż do
w katalogu Apps. Pojawia się on w dwóch Otrzymaliśmy wszystkie niezbędne linii rozpoczynającej certyfikat:
wersjach: dla języka Perl, jako plik dane, aby utworzyć certyfikat dla
o nazwie CA.pl, oraz jako zwykły skrypt klienta. Niestety, musimy samodziel- -----BEGIN CERTIFICATE-----
BASH-a  CA.sh. My będziemy korzystać nie przenieść pewne dane z plików
z tego drugiego (jego kopia znajduje się wygenerowanych przez skrypt CA.sh W ten sposób dysponujemy trzema pli-
również na płycie CD/DVD). i program openssl. Kopiujemy cześć kami, które są niezbędne do bezpiecz-
Pierwszym krokiem jest utworzenie opisującą certyfikat (Listing 3 przed- nej komunikacji pomiędzy serwerem
certyfikatu autoryzacji, czyli pliku CA. stawia ogólną postać tych plików) a klientem.
Gdy korzystamy z pomocy skryptu CA.sh,
wystarczy wydać krótkie polecenie:
Listing 4. Najważniejsze fragmenty programu serwera
# ./CA.sh -newca
#! /usr/bin/python
import sys
import Pyro.core
Skrypt utworzy kilka katalogów oraz plik
import Pyro.naming
z certyfikatem (znajdzie się on w katalo-
from Pyro.EventService.Clients import Publisher
gu demoCA). Zostaniemy również popro-
szeni o wypełnienie kilku pól.
# identyczna postać jak na Listingu 2
Następnie generujemy certyfikat żąda- class printCertValidator(Pyro.protocol.BasicSSLValidator):
class TalkSrv(Pyro.core.ObjBase, Publisher):
nia:
# ./CA.sh -newreq
Pyro.core.initServer()
Pyro.config.PYRO_TRACELEVEL=3
Pyro.config.PYRO_NS_HOSTNAME='localhost'
Tutaj ponownie zostaniemy poproszeni
Pyro.config.PYRO_LOGFILE='server_log'
o podanie kilku informacji. Po zakoń-
czeniu procesu powstanie plik o nazwie
newreq.pem. Następnym krokiem jest ns=Pyro.naming.NameServerLocator().getNS()
podpis certyfikatu żądania:
daemon=Pyro.core.Daemon(prtcol='PYROSSL')
daemon.setNewConnectionValidator(printCertValidator())
# ./CA.sh -sign
daemon.useNameServer(ns)
Powstanie plik o nazwie newcert.pem. uri=daemon.connect(TalkSrv(), "TalkSrv")
Teraz możemy odczytać frazę klucza
print "TalkServer is ready."
i w tym celu wydajemy polecenie:
daemon.requestLoop()
# openssl rsa < newreq.pem > newkey.pem
74
styczeń 2005
dla programistów
python/pyro/ssl
Dla tych z czytelników, którzy nie czyli nasze certyfikaty będą ważne z SSL zostały już omówione przy okazji
mieli styczności z takimi plikami, Li- przez 365 dni od momentu utworzenia. poprzedniego przykładu, więc musimy
sting 3 przedstawia schematycznie postać Jeśli chcemy to zmienić, wystarczy podać tylko zadbać, aby pliki z certyfikata-
poszczególnych plików. Przenosimy wyra- inną liczbę dni. mi znalazły się w podkatalogu certs,
żenia znajdujące się pomiędzy liniami: widocznym z poziomu programu ser-
Poprawiamy komunikator wera oraz klienta.
-----BEGIN CERTIFICATE----- Wiemy, jak wygenerować certyfikat oraz Podobna sytuacja pojawia się w pro-
-----END CERTIFICATE----- w jaki sposób należy napisać progra- gramie klienta  nie zmieniamy ele-
my serwera i klienta. Oznacza to, że mentów związanych z interfejsem
bądz bez żadnych kłopotów możemy zmo- graficznym, a sposób implementa-
dyfikować naszego komunikatora. cji klienta jest zgodny z przykłada-
-----BEGIN RSA PRIVATE KEY----- Zobaczmy, jak wygląda serwer. Isto- mi, które podałem na początku tego
-----END RSA PRIVATE KEY----- tne dla nas fragmenty zawiera Listing 4. artykułu.
Klasa printCertValidator pozostała nie
w przypadku klucza prywatnego. Mam zmieniona w stosunku do poprzed- OpenSSL w C/C++
nadzieje, że podane informacje pomogą nich przykładów, podobnie jak klasa Gdy chcemy pisać program bezpośred-
we własnym tworzeniu certyfikatów. TalkSrv. Poszczególne metody klasy ser- nio w języku C/C++, to sposób korzysta-
Certyfikaty z płyty CD/DVD są ważne wera również nie podlegają żadnym nia z OpenSSL nie jest znacznie bardziej
do listopada 2005 roku. Okres waż- zmianom. Jak widać z Listingu 4, pro- skomplikowany. Ogólny schemat two-
ności certyfikatów może być inny. gram serwera nie różni się niczym rzenia programu klienta wygląda wtedy
W pliku CA.sh po początkowych komen- specjalnym od programu z Listingu 2. następująco:
tarzach natrafiamy na zmienną DAYS: Włączenie obsługi SSL następuje
w momencie utworzenia obiektu /* utworzenie uchwytu SSL */
DAYS="-days 365" daemon. Wszystkie detale związane con=(SSL *)SSL_new();
R E K L A M A
75
www.lpmagazine.org
dla programistów
OpenSSL zostało wyposażone w odpo-
Listing 5. Najważniejsze fragmenty programu klienta
wiednie funkcje, które znacząco uprosz-
#! /usr/bin/python
czają ten problem, np. określenie certyfi-
katu to zadanie dla jednej funkcji:
import sys
import Pyro.util
SSL_use_certificate(con, server.cert )
import Pyro.core
from Pyro.EventService.Clients import Subscriber
from threading import Thread
W rezultacie wygląda to tak:
import gobject
/* utworzenie uchwytu SSL */
import gtk
con=(SSL *)SSL_new();
import gtk.glade
/* otwieramy zwykłe gniazdko
your_nick=''
do komunikacji sieciowej */
talks={}
/* kojarzymy uchwyt gniazda
z połączeniem SSL */
# identycznie, jak w poprzedniej wersji
SSL_set_fd(con,s);
def UpdateActiveList(): /* stosujemy klucz prywatny */
def OnEndBTN(*args):
SSL_use_RSAPrivateKey(con, server.rsa );
/* określamy certyfikat */
def OnTalkBTN(*args):
SSL_use_certificate(con, server.cert );
def OnCreateTalker(*args):
def OnEndNickBTN(*args): /* nawiązujemy połączenie */
class TalkSrvEvent(Subscriber):
SSL_accept(con);
class EventListener(Thread):
/*
class Talker:
stosując SSL_read() oraz SSL_write()
wymieniamy informacje pomiędzy
main_win_xml=gtk.glade.XML('MainWin.glade')
nick_win_xml=gtk.glade.XML('NickWin.glade') serwerem a klientem
*/
mainwin=main_win_xml.get_widget("MainWin")
# pozostałe polecenie odczytujące referencje do widgetów
Podsumowanie
Dołączenie obsługi SSL w naszej apli-
S
mySigID=gobject.signal_new("create_talker", gtk.Window, gobject.SIGNAL_RUN_LAST,
kacji do sieciowych rozmów okaza-
gobject.TYPE_BOOLEAN, (gtk.Window, gobject.TYPE_STRING, gobject.TYPE_STRING))
ło się zadaniem łatwym. Mam nadzie-
# signal connect
# ję, że każdy na podstawie zaprezento-
# podłączanie obsługi sygnałów
wanych przykładów będzie w stanie
EndNickBTN.connect('clicked', OnEndNickBTN)
samodzielnie dołączyć obsługę SSL do
własnej aplikacji napisanej z zastoso-
person_list_data=gtk.ListStore(gobject.TYPE_STRING)
waniem Pyro. Jak widać, sprowadza
person_list.set_model(person_list_data)
nick_column=gtk.TreeViewColumn('Nick\'s', gtk.CellRendererText(), text=0) się to tylko do wygenerowania cer-
person_list.append_column(nick_column)
tyfikatów oraz kilku zmian, głównie
w kodzie serwera.
mainwin.hide()
Bezpieczeństwo komunikacji zależy
również od certyfikatów. Jeśli stosujemy
Pyro.core.initClient()
Pyro.config.PYRO_TRACELEVEL=3 SSL, pamiętajmy o tym, aby zmieniać
Pyro.config.PYRO_NS_HOSTNAME='localhost'
certyfikaty, gdyż w ten sposób polep-
Pyro.config.PYRO_LOGFILE='client_log'
szamy poziom bezpieczeństwa naszego
programu.
TalkSrv = Pyro.core.getProxyForURI("PYRONAME://TalkSrv")
UpdateActiveList()
nickwin.show()
while gtk.main_iteration_do(False):
W Internecie:
pass
" Strona domowa pakietu Pyro:
http://pyro.sourceforge.net/
/* otwieramy zwykłe gniazdko do wymieniamy informacje pomiędzy
" Strona domowa pakietu M2Crypto:
komunikacji sieciowej */ klientem a serwerem
http://sandbox.rulemaker.net/
/* kojarzymy uchwyt gniazda */
ngps/m2/
z połączeniem SSL */
" Strona domowa pakietu OpenSSL:
SSL_set_fd(con,s); W przypadku serwera schemat korzysta-
http://www.openssl.org/
/* nawiązujemy połączenie */ nia z protokołu SSL jest równie prosty.
" Strona domowa języka Python:
SSL_connect(con); /* Problemem może wydawać się dołą-
http://www.python.org/
stosując SSL_read() oraz SSL_write() czenie certyfikatów, ale API biblioteki
76
styczeń 2005


Wyszukiwarka

Podobne podstrony:
2006 01 Analiza bezpieczeństwa komunikatora internetowego z wykorzystaniem platformy Linux [Bezpiecz
2007 01 Grę każdy napisać może! [Programowanie]
2004 01 Praca z OpenSSH [Administracja]
2005 01 37
NF 2005 01 zachowaj jako
NF 2005 01 zachowaj jako
NF 2005 01 angevina
Jan Paweł II 2005 01 24 List apostolski In rapido sviluppo ex libris legatur 2012r
01c 2005 01 II 5 ProbaPoznan
7 Internet i programowanie HTML (2)

więcej podobnych podstron