| # -*- coding: latin-1 -*- | |
| # | |
| # Copyright (C) AB Strakt | |
| # Copyright (C) Jean-Paul Calderone | |
| # See LICENSE for details. | |
| """ | |
| Simple SSL client, using blocking I/O | |
| """ | |
| import os | |
| import socket | |
| import sys | |
| from OpenSSL import SSL, crypto | |
| def verify_cb(conn, cert, errnum, depth, ok): | |
| certsubject = crypto.X509Name(cert.get_subject()) | |
| commonname = certsubject.commonName | |
| print('Got certificate: ' + commonname) | |
| return ok | |
| if len(sys.argv) < 3: | |
| print('Usage: python client.py HOST PORT') | |
| sys.exit(1) | |
| dir = os.path.dirname(sys.argv[0]) | |
| if dir == '': | |
| dir = os.curdir | |
| # Initialize context | |
| ctx = SSL.Context(SSL.SSLv23_METHOD) | |
| ctx.set_options(SSL.OP_NO_SSLv2) | |
| ctx.set_options(SSL.OP_NO_SSLv3) | |
| ctx.set_verify(SSL.VERIFY_PEER, verify_cb) # Demand a certificate | |
| ctx.use_privatekey_file(os.path.join(dir, 'client.pkey')) | |
| ctx.use_certificate_file(os.path.join(dir, 'client.cert')) | |
| ctx.load_verify_locations(os.path.join(dir, 'CA.cert')) | |
| # Set up client | |
| sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM)) | |
| sock.connect((sys.argv[1], int(sys.argv[2]))) | |
| while 1: | |
| line = sys.stdin.readline() | |
| if line == '': | |
| break | |
| try: | |
| sock.send(line) | |
| sys.stdout.write(sock.recv(1024).decode('utf-8')) | |
| sys.stdout.flush() | |
| except SSL.Error: | |
| print('Connection died unexpectedly') | |
| break | |
| sock.shutdown() | |
| sock.close() |