Stabilire Handshake
Următorul exemplu de cod inițiază o strângere de mână TLS cu un server TLS (numele serverului trebuie specificat ca prim argument al liniei de comandă). Putem observa cum prima data este deschisa o conexiune TCP peste care urmeaza sa folosim protocolul TLS.
#!/usr/bin/python3
import socket, ssl, sys, pprint
# Primim ca argument hostname-ul serverului, de exemplu google.com
hostname = sys.argv[1]
port = 443
# Create TCP connection
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((hostname, port))
input("After making TCP connection. Press any key to continue ...")
# You may need to change this depending on your Linux distro
cadir = '/etc/ssl/certs'
# Set up the TLS context
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
#context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) # For Ubuntu 16.04
context.load_verify_locations(capath=cadir)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
# Add the TLS
ssock = context.wrap_socket(sock, server_hostname=hostname,
do_handshake_on_connect=False)
ssock.do_handshake() # Start the handshake
pprint.pprint(ssock.getpeercert())
input("After handshake. Press any key to continue ...")
# Close the TLS Connection
ssock.shutdown(socket.SHUT_RDWR)
ssock.close()
Exercitiu 1. Folosind condul precedent, stabiliti o conexiune catre google.com si
raspundeti la urmatoarele intrebari:
- Care este algoritmul de criptare folosit?
- Ce reprezinta
/etc/ssl/certs? - Afisati certificatul serverului.
- Utilizați Wireshark pentru a captura traficul de rețea în timpul executării programului și explicați observațiile ce se intampla. În special, explicați care pas declanșează handshake-ul TCP, și care pas declanșează handshake-ul TLS. Explicați relația dintre cele doua handshake-uri.