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_result(), 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.SSLServer, 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.Context 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í.