Hlavní navigace

Knihovna M2Crypto (2)

Jakub Matys 14. 4. 2005

V dnešním dílu si ukážeme jednoduchý program pro připojení k https serveru. Na tomto příkladu si postupně vysvětlíme fungování M2Crypto.

Ukázkovým příkladem nám bude program, který se připojí k serveru www.verisign.com na port 443(SSL), pošle http požadavek a přijatá data zobrazí na standardní výstup. Zde je zdrojový kód:

#!/usr/bin/env python
'''Priklad pouziti M2Crypto - pripojeni k https serveru'''

request = "GET / HTTP/1.1\x0D\x0AHost: www.verisign.com\x0D\x0A\x43onnection: Close\x0D\x0A\x0D\x0A"

from M2Crypto.SSL.Context import Context
from M2Crypto.SSL.Connection import Connection
from sys import exit

ctx = Context() #vytvorime kontext pripojeni
ctx.load_verify_info('TrustStore.pem') #nacteme certifikat do kontextu

con = Connection(ctx) #vytvorime objekt pripojeni
if con.connect(('www.verisign.com', 443)) <= 0: #pokus o spojeni se serverem
    print 'Error attempting to connect'
    ctx.close()
    exit(1)

if not con.verify_ok(): #pokud nemame platny certifikat - chyba
    print 'Certificate verification error: %i' % con.get_verify_result() #cislo chyby
    con.close()
    ctx.close()
    exit(1)

con.write(request) #posleme pozadavek serveru
while 1:
    p = con.read(1023) #ziskame data ze serveru
    if p == '': break
    print p

con.close() #ukonceni spojeni
ctx.close() #uvolneni kontextu 

Začněme řádek po řádku, proměnná request obsahuje http požadavek, díky němuž získáme obsah webové stránky. Následují příkazy pro importování třídy Context a Connection.

Nový objekt kontextu vytvoříme voláním třídy Context, můžeme jí také jako argument předat typ použitého protokolu. Použitelnými hodnotami jsou řetězce sslv23(implicitní), sslv2 a sslv3. Metoda load_verify_info načítá CA certifikáty do kontextu, tyto certifikáty jsou poté ověřeny serverem. Může přijmout až dva parametry, prvním je soubor se zašifrovanými CA certifikáty, druhým potom cesta k tomuto souboru.

Pro připojení k serveru potřebujeme objekt připojení, ten zinicializujeme voláním třídy Connection, přičemž jí předáme kontext připojení. Druhým možným argumentem je soket existujícího spojení. Samotné připojení provedeme voláním metody connect, které předáme n-tici obsahující řetězec s adresou a číslo portu. V případě chyby metoda vrátí celé číslo menší než 1. Ověření, zda autentizace proběhla v pořádku, získáme voláním metody verify_ok. Jestliže ta vrátí 0, provedeme ještě volání con.get_verify_re­sult(), abychom získali číselné vyjádření chyby.

Odesílání a příjímání dat provedeme voláním metod write a read. U con.read můžeme zadat velikost vstupního bufferu. Spojení ukončíme voláním con.close(), kontext vyčistíme voláním ctx.close().

Určitě by také stálo za zmínku, že třída Connect slouží i k vytvoření SSL serveru. Toho také využívá modul M2Crypto.SSL.SSLSer­ver, který slouží k vytváření serverů (což budeme provádět v některém z dalších dílů). Pokud chceme vytvořit SSL server pomocí třídy Connect, musíme jí předat funkční soket připojení. Poté můžeme volat metody, které známe z třídy socket: accept, bind, close, listen, fileno…atd. Objekt ještě samozřejmě obsahuje metody specifické pro SSL. get_cipher vrátí M2Crypto.SSL.Cipher objekt použité šifry. get_context vrátí objekt M2Crypto.SSL.Con­text kontextu svázaného se spojením. Pro odesílání dat můžete také kromě metod write a read použít recv, send a sendall. Metody write, send a sendall jsou referencemi na _write_bio, read a recv zase na _read_bio.

Na závěr bych ještě rád upozornil na chybové třídy, které jsou uloženy v modulu M2Crypto.SSL.Error. Jedná se o třídy BIOError, DHError, DSAError, M2CryptoError, PKCS7_Error, RSAError, SMIME_Error, SSLError, UtilError a X509Error.

Aby vám ukázkový příklad fungoval, budete potřebovat certifikát. Samotný zdrojový kód je také ke stažení.

Našli jste v článku chybu?
Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

120na80.cz: Rovnátka, která nejsou vidět

Rovnátka, která nejsou vidět

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Jak vybrat ořechy do cukroví a kde mají levné

Jak vybrat ořechy do cukroví a kde mají levné

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Lupa.cz: Seznam mění vedení. Pavel Zima v čele končí

Seznam mění vedení. Pavel Zima v čele končí

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Podnikatel.cz: Na poslední chvíli šokuje výjimkami v EET

Na poslední chvíli šokuje výjimkami v EET

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: Babiš: E-shopy z EET možná vyjmeme

Babiš: E-shopy z EET možná vyjmeme

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu