Knihovna M2Crypto (2)

14. 4. 2005
Doba čtení: 3 minuty

Sdílet

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.

ict ve školství 24

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í.

Autor článku